Bcellmagic analysis pipeline
Pipeline overview
Number of sequences
Number of reads for each of the samples and number of sequences left
after representative analysis steps.
| ID |
Source |
Treatment |
Extraction_time |
Population |
Sequences_R1 |
Sequences_R2 |
Filtered_quality_R1 |
Filtered_quality_R2 |
Mask_primers_R1 |
Mask_primers_R2 |
Paired |
Build_consensus |
Assemble_pairs |
Unique |
Representative_2 |
Igblast |
| QMKMK229AC |
CLAD1 |
Cladribin |
baseline |
DN |
1001901 |
1001901 |
998230 |
929323 |
950964 |
889152 |
874759 |
523734 |
90354 |
59291 |
8472 |
6790 |
| QMKMK230AF |
CLAD1 |
Cladribin |
baseline |
N |
601885 |
601885 |
599360 |
566181 |
571750 |
543140 |
533806 |
402067 |
97531 |
92697 |
6385 |
4471 |
| QMKMK231AN |
CLAD1 |
Cladribin |
baseline |
M |
1036290 |
1036290 |
1033363 |
964197 |
980082 |
919636 |
904197 |
780525 |
135765 |
124169 |
4958 |
4670 |
| QMKMK232AV |
CLAD1 |
Cladribin |
baseline |
P |
1352414 |
1352414 |
1346800 |
1262235 |
1290104 |
1212304 |
1196447 |
939220 |
149863 |
130713 |
7714 |
6760 |
| QMKMK233A5 |
CLAD1 |
Cladribin |
6months |
DN |
1223690 |
1223690 |
1218476 |
1135468 |
1160160 |
1085218 |
1067347 |
791259 |
164348 |
121167 |
12720 |
11196 |
| QMKMK234AD |
CLAD1 |
Cladribin |
6months |
N |
577697 |
577697 |
574852 |
539847 |
539088 |
508859 |
500228 |
385783 |
89643 |
88089 |
4824 |
3042 |
| QMKMK235AL |
CLAD1 |
Cladribin |
6months |
M |
801072 |
801072 |
799337 |
750714 |
761523 |
718534 |
706606 |
608542 |
111207 |
95243 |
4519 |
4087 |
| QMKMK236AT |
CLAD1 |
Cladribin |
6months |
P |
2043123 |
2043123 |
2033938 |
1877437 |
1930800 |
1784871 |
1761332 |
1235843 |
181414 |
160573 |
15491 |
13605 |
| QMKMK241AU |
CLAD1 |
Cladribin |
12months |
DN |
1857453 |
1857453 |
1847028 |
1701105 |
1709731 |
1569714 |
1550126 |
857641 |
153794 |
117452 |
14305 |
11726 |
| QMKMK242A4 |
CLAD1 |
Cladribin |
12months |
M |
1850771 |
1850771 |
1846857 |
1708178 |
1770918 |
1632432 |
1611884 |
1280996 |
217155 |
195288 |
10505 |
7909 |
| QMKMK243AC |
CLAD1 |
Cladribin |
12months |
N |
1244736 |
1244736 |
1242282 |
1135476 |
1178264 |
1075176 |
1059637 |
679941 |
139275 |
136730 |
15410 |
4897 |
| QMKMK244AK |
CLAD1 |
Cladribin |
12months |
P |
1811754 |
1811754 |
1807946 |
1664568 |
1739221 |
1597527 |
1577659 |
1079483 |
254309 |
209762 |
21112 |
17524 |
| QMKMK533AN |
CLAD2 |
Cladribin |
baseline |
N |
299299 |
299299 |
298776 |
284644 |
278650 |
263896 |
259773 |
136538 |
42888 |
21024 |
3065 |
2478 |
| QMKMK534AV |
CLAD2 |
Cladribin |
baseline |
M |
911354 |
911354 |
909208 |
856360 |
853308 |
802774 |
789542 |
619034 |
99507 |
87314 |
6089 |
5676 |
| QMKMK535A5 |
CLAD2 |
Cladribin |
baseline |
DN |
1548122 |
1548122 |
1546518 |
1485086 |
1455661 |
1392202 |
1373849 |
746018 |
162419 |
91821 |
14291 |
12022 |
| QMKMK536AD |
CLAD2 |
Cladribin |
baseline |
P |
828075 |
828075 |
826764 |
781959 |
769833 |
729669 |
715212 |
583392 |
116702 |
101158 |
7315 |
7063 |
| QMKMK537AL |
CLAD2 |
Cladribin |
6months |
N |
1695948 |
1695948 |
1695010 |
1636672 |
1564060 |
1506398 |
1482971 |
541495 |
162342 |
145708 |
25035 |
10021 |
| QMKMK538AT |
CLAD2 |
Cladribin |
6months |
M |
2467900 |
2467900 |
2466808 |
2356982 |
2309769 |
2200497 |
2169463 |
767599 |
187812 |
126230 |
19934 |
17409 |
| QMKMK539A3 |
CLAD2 |
Cladribin |
6months |
DN |
1670407 |
1670407 |
1669498 |
1608729 |
1548656 |
1486886 |
1464870 |
472354 |
119636 |
57322 |
9889 |
8396 |
| QMKMK540A6 |
CLAD2 |
Cladribin |
6months |
P |
1418658 |
1418658 |
1417830 |
1366294 |
1320682 |
1272534 |
1251506 |
771396 |
206754 |
144573 |
18117 |
16226 |
| QMKMK541AE |
CLAD2 |
Cladribin |
12months |
N |
1254799 |
1254799 |
1253722 |
1212466 |
1174117 |
1107772 |
1090535 |
522116 |
180331 |
174806 |
16654 |
7429 |
| QMKMK542AM |
CLAD2 |
Cladribin |
12months |
M |
2480119 |
2480119 |
2478403 |
2372338 |
2315848 |
2199929 |
2166193 |
1126337 |
265733 |
232685 |
15947 |
13290 |
| QMKMK543AU |
CLAD2 |
Cladribin |
12months |
DN |
1492340 |
1492340 |
1491521 |
1430650 |
1373414 |
1309222 |
1288903 |
743614 |
187692 |
140124 |
15720 |
12862 |
| QMKMK544A4 |
CLAD2 |
Cladribin |
12months |
P |
1104002 |
1104002 |
1103382 |
1063497 |
1036043 |
994570 |
979051 |
493550 |
147756 |
93526 |
13523 |
11414 |
| QMKMK545AC |
CLAD3 |
Cladribin |
baseline |
N |
1571620 |
1571620 |
1570771 |
1523584 |
1497824 |
1451341 |
1431781 |
543127 |
171669 |
143577 |
26458 |
14092 |
| QMKMK546AK |
CLAD3 |
Cladribin |
baseline |
M |
1798031 |
1798031 |
1796794 |
1739586 |
1712984 |
1656005 |
1636655 |
1007055 |
254908 |
229383 |
13572 |
12353 |
| QMKMK547AS |
CLAD3 |
Cladribin |
baseline |
DN |
1325826 |
1325826 |
1324051 |
1277183 |
1262297 |
1218805 |
1199399 |
629789 |
146170 |
105948 |
13939 |
11562 |
| QMKMK548A2 |
CLAD3 |
Cladribin |
baseline |
P |
1375460 |
1375460 |
1374152 |
1327752 |
1308934 |
1264258 |
1245115 |
730531 |
161034 |
141145 |
13243 |
12400 |
| QMKMK549AA |
CLAD3 |
Cladribin |
6months |
N |
1385899 |
1385899 |
1385012 |
1335147 |
1305595 |
1255991 |
1239376 |
490511 |
158561 |
140713 |
30701 |
13136 |
| QMKMK550AD |
CLAD3 |
Cladribin |
6months |
M |
1240876 |
1240876 |
1240142 |
1207393 |
1183864 |
1149887 |
1136654 |
681735 |
204620 |
143599 |
17407 |
15520 |
| QMKMK551AL |
CLAD3 |
Cladribin |
6months |
DN |
261349 |
261349 |
260058 |
244972 |
215326 |
231145 |
197023 |
176276 |
32325 |
19157 |
2454 |
1429 |
| QMKMK552AT |
CLAD3 |
Cladribin |
6months |
P |
235034 |
235034 |
234857 |
229626 |
224030 |
219497 |
216216 |
172573 |
77444 |
53394 |
7446 |
7258 |
| QMKMK553A3 |
CLAD3 |
Cladribin |
12months |
N |
1591756 |
1591756 |
1590676 |
1540766 |
1517741 |
1464383 |
1445065 |
515307 |
173696 |
149077 |
28654 |
15266 |
| QMKMK554AB |
CLAD3 |
Cladribin |
12months |
M |
1564019 |
1564019 |
1562831 |
1507023 |
1492048 |
1428178 |
1411785 |
779001 |
213213 |
166219 |
19733 |
15266 |
| QMKMK555AJ |
CLAD3 |
Cladribin |
12months |
DN |
111483 |
111483 |
111312 |
107140 |
103242 |
100959 |
97245 |
85541 |
42105 |
30219 |
5062 |
4850 |
| QMKMK556AR |
CLAD3 |
Cladribin |
12months |
P |
155013 |
155013 |
154892 |
151406 |
146876 |
144291 |
141167 |
87747 |
48027 |
25315 |
4504 |
4231 |
| QMKMK557A1 |
CLAD4 |
Cladribin |
baseline |
N |
1398965 |
1398965 |
1392433 |
1294121 |
1330529 |
1238996 |
1220960 |
745812 |
129060 |
123160 |
9747 |
4513 |
| QMKMK558A9 |
CLAD4 |
Cladribin |
baseline |
M |
1374928 |
1374928 |
1368571 |
1237182 |
1305056 |
1178785 |
1164891 |
979676 |
141173 |
122743 |
6397 |
5864 |
| QMKMK559AH |
CLAD4 |
Cladribin |
baseline |
DN |
2409179 |
2409179 |
2398262 |
2172405 |
2301729 |
2083291 |
2058484 |
1124304 |
196878 |
154809 |
19618 |
16839 |
| QMKMK560AK |
CLAD4 |
Cladribin |
baseline |
P |
1068173 |
1068173 |
1064298 |
978142 |
1021878 |
940132 |
928637 |
709473 |
170030 |
146347 |
9104 |
8545 |
| QMKMK561AS |
CLAD4 |
Cladribin |
6months |
N |
1641107 |
1641107 |
1576042 |
1345005 |
1477248 |
1274519 |
1229456 |
874314 |
68880 |
67173 |
2444 |
132 |
| QMKMK562A2 |
CLAD4 |
Cladribin |
6months |
M |
1385399 |
1385399 |
1379705 |
1250203 |
1320361 |
1196503 |
1179563 |
962386 |
157538 |
143239 |
7102 |
6064 |
| QMKMK563AA |
CLAD4 |
Cladribin |
6months |
DN |
2589345 |
2589345 |
2576384 |
2318103 |
2466634 |
2218225 |
2186658 |
1244923 |
195806 |
163852 |
20595 |
16888 |
| QMKMK564AI |
CLAD4 |
Cladribin |
6months |
P |
1801823 |
1801823 |
1794104 |
1626149 |
1707738 |
1549822 |
1527755 |
970293 |
139581 |
117108 |
10526 |
9214 |
| QMKMK565AQ |
CLAD4 |
Cladribin |
12months |
N |
1233912 |
1233912 |
1227233 |
1127439 |
1171418 |
1074382 |
1058954 |
706032 |
124861 |
119933 |
8175 |
4157 |
| QMKMK566A0 |
CLAD4 |
Cladribin |
12months |
M |
1519136 |
1519136 |
1511801 |
1377911 |
1458300 |
1325813 |
1307238 |
1038900 |
165094 |
139607 |
10053 |
9030 |
| QMKMK567A8 |
CLAD4 |
Cladribin |
12months |
DN |
1084835 |
1084835 |
1077309 |
963006 |
985191 |
874572 |
862952 |
641429 |
113514 |
106906 |
8242 |
4475 |
| QMKMK568AG |
CLAD4 |
Cladribin |
12months |
P |
1322433 |
1322433 |
1317876 |
1210528 |
1271272 |
1164834 |
1150760 |
665756 |
151153 |
105442 |
9341 |
7208 |
| QMKMK569AO |
CLAD5 |
Cladribin |
baseline |
N |
1447197 |
1447197 |
1445335 |
1373651 |
1337298 |
1269719 |
1252608 |
619522 |
174482 |
158367 |
18757 |
6710 |
| QMKMK570AR |
CLAD5 |
Cladribin |
baseline |
M |
1468661 |
1468661 |
1466765 |
1367672 |
1319151 |
1225178 |
1209652 |
893529 |
189690 |
167978 |
7970 |
6680 |
| QMKMK571A1 |
CLAD5 |
Cladribin |
baseline |
DN |
1126741 |
1126741 |
1125031 |
1062795 |
1031127 |
971370 |
960077 |
512019 |
112116 |
70502 |
9251 |
6405 |
| QMKMK572A9 |
CLAD5 |
Cladribin |
baseline |
P |
1397460 |
1397460 |
1396014 |
1316108 |
1290285 |
1214297 |
1199625 |
843530 |
178333 |
134207 |
12210 |
10853 |
| QMKMK573AH |
CLAD5 |
Cladribin |
6months |
N |
1329042 |
1329042 |
1326871 |
1258667 |
1193608 |
1129648 |
1114054 |
535460 |
159471 |
147244 |
17033 |
5721 |
| QMKMK574AP |
CLAD5 |
Cladribin |
6months |
M |
1237833 |
1237833 |
1236499 |
1162554 |
1137697 |
1066878 |
1053987 |
813652 |
164645 |
137354 |
6905 |
6396 |
| QMKMK575AX |
CLAD5 |
Cladribin |
6months |
DN |
1383178 |
1383178 |
1381643 |
1296415 |
1266158 |
1181512 |
1167639 |
852502 |
190750 |
173985 |
7869 |
5721 |
| QMKMK576A7 |
CLAD5 |
Cladribin |
6months |
P |
1262705 |
1262705 |
1261244 |
1179067 |
1143706 |
1064972 |
1051693 |
793719 |
206575 |
171238 |
10789 |
9636 |
| QMKMK577AF |
CLAD5 |
Cladribin |
12months |
N |
1351967 |
1351967 |
1350771 |
1280959 |
1243575 |
1172545 |
1156655 |
527191 |
156413 |
144948 |
15828 |
5310 |
| QMKMK578AN |
CLAD5 |
Cladribin |
12months |
M |
713600 |
713600 |
712818 |
676328 |
667632 |
628686 |
622159 |
517446 |
126346 |
101975 |
4161 |
3828 |
| QMKMK579AV |
CLAD5 |
Cladribin |
12months |
DN |
2456014 |
2456014 |
2451084 |
2269903 |
2141182 |
1958202 |
1938322 |
660015 |
132912 |
86965 |
14241 |
11745 |
| QMKMK580A0 |
CLAD5 |
Cladribin |
12months |
P |
834969 |
834969 |
834181 |
787283 |
779041 |
731399 |
722664 |
580598 |
147105 |
115414 |
6571 |
6142 |
| QMKMK581A8 |
CLAD6 |
Cladribin |
baseline |
N |
1001206 |
1001206 |
1000860 |
970356 |
962940 |
936587 |
920818 |
443222 |
140232 |
86145 |
18839 |
12881 |
| QMKMK582AG |
CLAD6 |
Cladribin |
baseline |
M |
1283684 |
1283684 |
1283183 |
1244329 |
1236314 |
1203407 |
1184237 |
788065 |
169359 |
149750 |
15320 |
14342 |
| QMKMK583AO |
CLAD6 |
Cladribin |
baseline |
DN |
1097528 |
1097528 |
1096978 |
1066751 |
1063618 |
1033309 |
1021656 |
634966 |
162233 |
105871 |
17897 |
16466 |
| QMKMK584AW |
CLAD6 |
Cladribin |
baseline |
P |
1016627 |
1016627 |
1016172 |
988801 |
984990 |
962146 |
947239 |
442682 |
163962 |
76800 |
20099 |
18856 |
| QMKMK585A6 |
CLAD6 |
Cladribin |
6months |
N |
1285504 |
1285504 |
1285176 |
1251705 |
1229806 |
1201931 |
1182778 |
543799 |
171992 |
148549 |
28207 |
18306 |
| QMKMK586AE |
CLAD6 |
Cladribin |
6months |
M |
1330009 |
1330009 |
1329416 |
1292399 |
1284875 |
1253526 |
1233148 |
891220 |
225136 |
195466 |
18430 |
16976 |
| QMKMK587AM |
CLAD6 |
Cladribin |
6months |
DN |
1242825 |
1242825 |
1240467 |
1197808 |
1200344 |
1156147 |
1137148 |
654641 |
192546 |
126256 |
26229 |
24526 |
| QMKMK588AU |
CLAD6 |
Cladribin |
6months |
P |
1002045 |
1002045 |
1001430 |
967754 |
965269 |
932794 |
921632 |
434169 |
147302 |
84076 |
18894 |
16986 |
| QMKMK589A4 |
CLAD6 |
Cladribin |
12months |
N |
1137999 |
1137999 |
1137344 |
1103323 |
1097509 |
1066778 |
1049119 |
462125 |
140904 |
135519 |
21100 |
13153 |
| QMKMK590A7 |
CLAD6 |
Cladribin |
12months |
M |
1209002 |
1209002 |
1208461 |
1171649 |
1172398 |
1134117 |
1117971 |
734224 |
260959 |
216292 |
24198 |
22100 |
| QMKMK591AF |
CLAD6 |
Cladribin |
12months |
DN |
1197736 |
1197736 |
1197184 |
1151818 |
1136481 |
1087259 |
1076116 |
597057 |
230367 |
158141 |
28591 |
25804 |
| QMKMK592AN |
CLAD6 |
Cladribin |
12months |
P |
992655 |
992655 |
992309 |
965445 |
964234 |
935022 |
924219 |
613740 |
189846 |
142598 |
19691 |
18074 |
| QMKMK593AV |
CLAD7 |
Cladribin |
baseline |
N |
1072973 |
1072973 |
1072013 |
1039366 |
988048 |
953478 |
940620 |
440561 |
133368 |
110804 |
16445 |
7779 |
| QMKMK594A5 |
CLAD7 |
Cladribin |
baseline |
M |
1840517 |
1840517 |
1838589 |
1774842 |
1701120 |
1635963 |
1614648 |
951547 |
227992 |
188707 |
14405 |
12975 |
| QMKMK595AD |
CLAD7 |
Cladribin |
baseline |
DN |
1440796 |
1440796 |
1438064 |
1373169 |
1336916 |
1271791 |
1252865 |
628764 |
132142 |
78579 |
11112 |
9216 |
| QMKMK596AL |
CLAD7 |
Cladribin |
baseline |
P |
1677725 |
1677725 |
1676137 |
1618758 |
1542366 |
1484679 |
1464832 |
759842 |
228681 |
135178 |
19623 |
17045 |
| QMKMK597AT |
CLAD7 |
Cladribin |
6months |
N |
1239270 |
1239270 |
1237713 |
1198319 |
1123326 |
1081563 |
1066953 |
497751 |
144787 |
123197 |
13744 |
7291 |
| QMKMK598A3 |
CLAD7 |
Cladribin |
6months |
M |
1298404 |
1298404 |
1297197 |
1252956 |
1196708 |
1145838 |
1133594 |
718360 |
193455 |
162681 |
15846 |
12138 |
| QMKMK599AB |
CLAD7 |
Cladribin |
6months |
DN |
1254978 |
1254978 |
1253336 |
1203733 |
1142735 |
1087229 |
1075266 |
641337 |
171226 |
151010 |
14466 |
9894 |
| QMKMK600AI |
CLAD7 |
Cladribin |
6months |
P |
1479917 |
1479917 |
1470919 |
1412765 |
1358861 |
1304396 |
1281664 |
714210 |
66255 |
62209 |
3083 |
1415 |
| QMKMK601AQ |
CLAD7 |
Cladribin |
12months |
N |
1149545 |
1149545 |
1148532 |
1113085 |
1063607 |
1023791 |
1009898 |
423783 |
141213 |
121701 |
15720 |
8170 |
| QMKMK602A0 |
CLAD7 |
Cladribin |
12months |
M |
1939178 |
1939178 |
1936601 |
1866139 |
1800331 |
1717691 |
1698002 |
1106596 |
245522 |
189688 |
17128 |
15293 |
| QMKMK603A8 |
CLAD7 |
Cladribin |
12months |
DN |
1545739 |
1545739 |
1541982 |
1470482 |
1406198 |
1325331 |
1310600 |
517285 |
81955 |
48826 |
7514 |
6121 |
| QMKMK604AG |
CLAD7 |
Cladribin |
12months |
P |
1211943 |
1211943 |
1210523 |
1172308 |
1132847 |
1087549 |
1075259 |
486518 |
138915 |
90522 |
13011 |
10486 |
| QMKMK605AO |
CLAD8 |
Cladribin |
baseline |
N |
1444889 |
1444889 |
1444445 |
1385795 |
1385248 |
1321867 |
1304667 |
533333 |
155798 |
139077 |
20017 |
6759 |
| QMKMK606AW |
CLAD8 |
Cladribin |
baseline |
M |
1703561 |
1703561 |
1701051 |
1643939 |
1631017 |
1568457 |
1549559 |
1091551 |
151421 |
140102 |
8872 |
5779 |
| QMKMK607A6 |
CLAD8 |
Cladribin |
baseline |
DN |
1108324 |
1108324 |
1107613 |
1067244 |
1061080 |
1015816 |
1004178 |
528412 |
115795 |
81992 |
8232 |
6779 |
| QMKMK608AE |
CLAD8 |
Cladribin |
baseline |
P |
1540452 |
1540452 |
1539639 |
1477308 |
1482318 |
1412976 |
1397948 |
991926 |
207541 |
162117 |
13883 |
12397 |
| QMKMK609AM |
CLAD8 |
Cladribin |
6months |
N |
834333 |
834333 |
834049 |
798958 |
780110 |
742394 |
733064 |
418241 |
125716 |
105779 |
11088 |
5615 |
| QMKMK610AP |
CLAD8 |
Cladribin |
6months |
M |
1106235 |
1106235 |
1104644 |
1054961 |
1057632 |
1004099 |
991576 |
776744 |
157852 |
130084 |
6879 |
6471 |
| QMKMK611AX |
CLAD8 |
Cladribin |
6months |
DN |
1303870 |
1303870 |
1303135 |
1240914 |
1243559 |
1172185 |
1160462 |
730474 |
200257 |
157489 |
15954 |
11884 |
| QMKMK612A7 |
CLAD8 |
Cladribin |
6months |
P |
968338 |
968338 |
967925 |
925579 |
923220 |
878144 |
867982 |
661725 |
189758 |
152493 |
10350 |
8882 |
| QMKMK613AF |
CLAD8 |
Cladribin |
12months |
N |
1798683 |
1798683 |
1798081 |
1723011 |
1727265 |
1641478 |
1620069 |
633213 |
173676 |
154775 |
21448 |
8049 |
| QMKMK614AN |
CLAD8 |
Cladribin |
12months |
M |
1186393 |
1186393 |
1185783 |
1139636 |
1142249 |
1085053 |
1073036 |
752118 |
179324 |
153196 |
8280 |
7679 |
| QMKMK615AV |
CLAD8 |
Cladribin |
12months |
DN |
1407945 |
1407945 |
1407291 |
1342821 |
1314510 |
1238663 |
1225435 |
715687 |
188862 |
157705 |
12270 |
9190 |
| QMKMK616A5 |
CLAD8 |
Cladribin |
12months |
P |
1029639 |
1029639 |
1029226 |
988857 |
995363 |
947316 |
936477 |
661648 |
182340 |
158080 |
7835 |
7172 |
Plotting number of unique sequences

Plotting number of representative 2 sequences

Plotting number of Igblast identified sequences

Clonal abundance
For plotting the clonal abundance, the clones were ordered by size
from bigger clones to smaller clones (x-axis, Rank). The Abundance of
each clone was represented as the percentage of unique sequences in the
clone, with respect to the total number of unique sequences in that
subject (By Patient) or in the B-cell or T-cell sample (By Cell
Population).
To correct for the different number of sequences in each of the
samples, the Bootstrapping technique was employed, in which 200 random
bootstrap samples were taken, with size the number of sequences in the
sample with less sequences (N). The solid line shows the mean Abundance
of the bootstrap samples, whereas the transparent area shows the full
Abundance range of the bootstrap samples.
All clonal abundance plots and tables with abundance values can be
found under repertoire_analysis/Abundance.
Clonal abundance per subject

Calculate area under the curve for abundance
Count clones per subject
Clonal abundance per cell population
If different types of B-cell or T-cell populations are provided, here
the clonal abundance is plotted for each patient and B / T-cell
population.

Clonal diversity
The clonal diversity \(D\) of the
repertoire was calculated according to the general formula of Hill
Diversity numbers:
\[
\begin{aligned}
^{q}D = \left( \sum_{i=1}^Rp_i^q \right)^{1/(1-q)}
\end{aligned}
\]
where:
- \(p_i\) is the proportion of unique
sequences belonging to clone \(i\).
- \(q\) are the values of the
different diversity numbers.
- \(R\) is the Richness, the number
of different clones in the sample.
At \(q=1\) the function is undefined
and the limit to zero equals the exponential of the Shannon Entropy:
\[
\begin{aligned}
^{1}D = exp \left( \sum_{i=1}^Rp_i ln(p_i) \right)
\end{aligned}
\]
The intuition about the different Hill Diversity values is the
following:
- At \(q=0\) the diversity index
equals the number of clones in the sample.
- At \(q=1\) the diversity index is
the geometric mean of the clones in the sample, weighted by their
proportion in the sample.
- At \(q>1\) more weight is given
to the clones with higher proportions in the sample.
All clonal diversity plots and tables with diversity values can be
found under repertoire_analysis/Diversity. To correct for
the different number of sequences in each of the samples, the
Bootstrapping technique was employed, in which 200 random bootstrap
samples were taken, with size the number of sequences in the sample with
less sequences (N). The solid line shows the mean Diversity of the
bootstrap samples, whereas the transparent area shows the full Diversity
range of the bootstrap samples.
Clonal diversity per subject

Clonal diversity at specific
q values
q=1

q=0

Clonal diversity per cell population
|=== | 5% ~38 s remaining
|==== | 6% ~38 s remaining
|===== | 7% ~1 m remaining
|====== | 8% ~1 m remaining
|====== | 9% ~1 m remaining
|======= | 11% ~1 m remaining
|======== | 12% ~1 m remaining
|========= | 13% ~1 m remaining
|========= | 14% ~57 s remaining
|========== | 15% ~53 s remaining
|=========== | 16% ~51 s remaining
|============ | 17% ~48 s remaining
|============ | 18% ~46 s remaining
|============= | 19% ~43 s remaining
|============== | 20% ~42 s remaining
|=============== | 21% ~40 s remaining
|=============== | 22% ~39 s remaining
|================ | 23% ~37 s remaining
|================= | 24% ~41 s remaining
|================== | 25% ~39 s remaining
|================== | 26% ~38 s remaining
|=================== | 27% ~36 s remaining
|==================== | 28% ~35 s remaining
|===================== | 29% ~34 s remaining
|===================== | 31% ~33 s remaining
|====================== | 32% ~32 s remaining
|======================= | 33% ~37 s remaining
|======================== | 34% ~35 s remaining
|========================= | 35% ~34 s remaining
|========================= | 36% ~33 s remaining
|========================== | 37% ~32 s remaining
|=========================== | 38% ~31 s remaining
|============================ | 39% ~30 s remaining
|============================ | 40% ~29 s remaining
|============================= | 41% ~29 s remaining
|============================== | 42% ~28 s remaining
|=============================== | 43% ~27 s remaining
|=============================== | 44% ~26 s remaining
|================================ | 45% ~25 s remaining
|================================= | 46% ~25 s remaining
|================================== | 47% ~24 s remaining
|================================== | 48% ~24 s remaining
|=================================== | 49% ~23 s remaining
|==================================== | 51% ~22 s remaining
|===================================== | 52% ~21 s remaining
|===================================== | 53% ~21 s remaining
|====================================== | 54% ~20 s remaining
|======================================= | 55% ~19 s remaining
|======================================== | 56% ~19 s remaining
|======================================== | 57% ~18 s remaining
|========================================= | 58% ~18 s remaining
|========================================== | 59% ~17 s remaining
|=========================================== | 60% ~17 s remaining
|=========================================== | 61% ~16 s remaining
|============================================ | 62% ~16 s remaining
|============================================= | 63% ~15 s remaining
|============================================== | 64% ~15 s remaining
|============================================== | 65% ~14 s remaining
|=============================================== | 66% ~14 s remaining
|================================================ | 67% ~13 s remaining
|================================================= | 68% ~12 s remaining
|================================================== | 69% ~12 s remaining
|================================================== | 71% ~12 s remaining
|=================================================== | 72% ~11 s remaining
|==================================================== | 73% ~11 s remaining
|===================================================== | 74% ~10 s remaining
|===================================================== | 75% ~10 s remaining
|====================================================== | 76% ~9 s remaining
|======================================================= | 77% ~9 s remaining
|======================================================== | 78% ~8 s remaining
|======================================================== | 79% ~8 s remaining
|========================================================= | 80% ~8 s remaining
|========================================================== | 81% ~7 s remaining
|=========================================================== | 82% ~7 s remaining
|=========================================================== | 83% ~6 s remaining
|============================================================ | 84% ~6 s remaining
|============================================================= | 85% ~5 s remaining
|============================================================== | 86% ~5 s remaining
|============================================================== | 87% ~5 s remaining
|=============================================================== | 88% ~4 s remaining
|================================================================ | 89% ~4 s remaining
|================================================================= | 91% ~3 s remaining
|================================================================= | 92% ~3 s remaining
|================================================================== | 93% ~3 s remaining
|=================================================================== | 94% ~2 s remaining
|==================================================================== | 95% ~2 s remaining
|==================================================================== | 96% ~1 s remaining
|===================================================================== | 97% ~1 s remaining
|====================================================================== | 98% ~1 s remaining
|======================================================================= | 99% ~0 s remaining
|========================================================================|100% ~0 s remaining

Clonal diversity per
population at specific q values
q=1

q=0

V gene usage
V gene family usage
The V gene usage (in percentage) in each of the samples is
represented below. All plots and tables can be found here.
Gene family usage is normalized by the number of clones.
By Population

V gene usage
The V gene usage (in percentage) in each of the samples is
represented below. All plots and tables can be found here.
By clones

By sequences

Isotype usage
Isotype usage per subject
`summarise()` has grouped output by 'isotype', 'sample', 'source', 'treatment'. You can override using the `.groups` argument.

Isotype usage per cell population
`summarise()` has grouped output by 'isotype', 'sample_pop', 'source', 'treatment', 'extract_time'. You can override using the `.groups` argument.

Clonal overlap analysis
'repertoire_comparison/Clone_overlap' already existsError in paste(outdir, "Clone_overlap", names(df_pat)[i], sep = "/") :
object 'i' not found
Citations
If you use nf-core/bcellmagic for your analysis, please cite it using
the following DOI: 10.5281/zenodo.3607408
Please also cite the nf-core publication (P. A. Ewels et al. 2020).
In addition, citations for the tools and data used in this pipeline
are as follows:
- pRESTO (Vander Heiden et al.
2014)
- SHazaM, Change-O (Gupta et
al. 2015)
- Alakazam (Stern et al.
2014)
- TIgGER (Gadala-Maria et al.
2015)
- FastQC (Andrews et al.
2010)
- MultiQC (P. Ewels et al.
2016)
Andrews, Simon et al. 2010. “FastQC: A Quality Control Tool for
High Throughput Sequence Data.”
Ewels, Philip A., Alexander Peltzer, Sven Fillinger, Harshil Patel,
Johannes Alneberg, Andreas Wilm, Maxime Ulysse Garcia, Paolo Di Tommaso,
and Sven Nahnsen. 2020.
“The Nf-Core Framework for
Community-Curated Bioinformatics Pipelines.” Nature
Biotechnology 38 (3): 276–78.
https://doi.org/10.1038/s41587-020-0439-x.
Ewels, Philip, Måns Magnusson, Sverker Lundin, and Max Käller. 2016.
“MultiQC: Summarize Analysis Results for Multiple Tools and
Samples in a Single Report.” Bioinformatics 32 (19):
3047–48.
Gadala-Maria, Daniel, Gur Yaari, Mohamed Uduman, and Steven H.
Kleinstein. 2015.
“Automated Analysis of High-Throughput b-Cell
Sequencing Data Reveals a High Frequency of Novel Immunoglobulin v Gene
Segment Alleles.” Proceedings of the National Academy of
Sciences of the United States of America 112 (8): E862–870.
https://doi.org/10.1073/pnas.1417683112.
Gupta, Namita T., Jason A. Vander Heiden, Mohamed Uduman, Daniel
Gadala-Maria, Gur Yaari, and Steven H. Kleinstein. 2015.
“Change-o: A Toolkit for Analyzing Large-Scale b Cell
Immunoglobulin Repertoire Sequencing Data.”
Bioinformatics 31 (20): 3356–58.
https://doi.org/10.1093/bioinformatics/btv359.
Stern, Joel N. H., Gur Yaari, Jason A. Vander Heiden, George Church,
William F. Donahue, Rogier Q. Hintzen, Anita J. Huttner, et al. 2014.
“B Cells Populating the Multiple Sclerosis Brain Mature in the
Draining Cervical Lymph Nodes.” Science Translational
Medicine 6 (248).
https://doi.org/10.1126/scitranslmed.3008879.
Vander Heiden, Jason A., Gur Yaari, Mohamed Uduman, Joel N. H. Stern,
Kevin C. O’Connor, David A. Hafler, Francois Vigneault, and Steven H.
Kleinstein. 2014.
“pRESTO: A Toolkit for Processing
High-Throughput Sequencing Raw Reads of Lymphocyte Receptor
Repertoires.” Bioinformatics 30 (13): 1930–32.
https://doi.org/10.1093/bioinformatics/btu138.
LS0tCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFibGUgb2YgY29udGVudHMKICAgIHRvY19mbG9hdDogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICAjIGZsb2F0IHRoZSB0YWJsZSBvZiBjb250ZW50cyB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiBkb2N1bWVudCBjb250ZW50CiAgICB0b2NfZGVwdGg6IDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoZWFkZXIgbGV2ZWxzIDEsMiwzCiAgICB0aGVtZTogZGVmYXVsdAogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZSAgICAgICAgICAgICAgICAgICMgYWRkIHNlY3Rpb24gbnVtYmVyaW5nIHRvIGhlYWRlcnMKICAgIGRmX3ByaW50OiBwYWdlZCAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhYmxlcyBhcmUgcHJpbnRlZCBhcyBhbiBodG1sIHRhYmxlIHdpdGggc3VwcG9ydCBmb3IgcGFnaW5hdGlvbiBvdmVyIHJvd3MgYW5kIGNvbHVtbnMKICAgIGNzczogLi9uZi1jb3JlX3N0eWxlLmNzcwogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgcGRmX2RvY3VtZW50OiB0cnVlCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCmJpYmxpb2dyYXBoeTogLi9yZWZlcmVuY2VzLmJpYnRleAotLS0KCgotLS0KdGl0bGU6ICJSZXBlcnRvaXJlIGFuYWx5c2lzIgpzdWJ0aXRsZTogIkNsb25hbCBhYnVuZGFuY2UsIGRpdmVyc2l0eSBhbmQgVi1mYW1pbHkgZ2VuZSB1c2FnZSIKZGF0ZTogJ2ByIGZvcm1hdChTeXMuRGF0ZSgpLCAiJUIgJWQsICVZIilgJwpvdXRwdXQ6IGh0bWxfZG9jdW1lbnQKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShkcGx5cikKbGlicmFyeShhbGFrYXphbSkKbGlicmFyeShzaGF6YW0pCmxpYnJhcnkoc3RyaW5ncikKCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkoZ3Bsb3RzKQpsaWJyYXJ5KGNpcmNsaXplKQpsaWJyYXJ5KFVwU2V0UikKbGlicmFyeShndG9vbHMpCgp0aGVtZV9zZXQodGhlbWVfYncoYmFzZV9mYW1pbHkgPSAiQXJpYWxNVCIpICsKICAgICAgICAgICAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHk9IkFyaWFsTVQiKSkpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoqKioKCiMgQmNlbGxtYWdpYyBhbmFseXNpcyBwaXBlbGluZQoKIyMgUGlwZWxpbmUgb3ZlcnZpZXcKCiMjIE51bWJlciBvZiBzZXF1ZW5jZXMKCk51bWJlciBvZiByZWFkcyBmb3IgZWFjaCBvZiB0aGUgc2FtcGxlcyBhbmQgbnVtYmVyIG9mIHNlcXVlbmNlcyBsZWZ0IGFmdGVyIHJlcHJlc2VudGF0aXZlIGFuYWx5c2lzIHN0ZXBzLgoKYGBge3Igc2VxX251bWJlcnMsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojVE9ETyByZWFkIFRhYmxlIHNlcXVlbmNlcwp0YWJfc2VxcyA8LSByZWFkLnRhYmxlKCIuLi9wYXJzZWRfbG9ncy9zZXF1ZW5jZXNfdGFibGUvVGFibGVfc2VxdWVuY2VzX3Byb2Nlc3MudHN2IiwgaGVhZGVyPVRSVUUsIHNlcD0iXHQiLCBjaGVjay5uYW1lcyA9IEZBTFNFKQprYWJsZSh0YWJfc2VxcykgJT4lCiAgICBrYWJsZV9zdHlsaW5nKCJob3ZlciIpICU+JQogICAgc2Nyb2xsX2JveCh3aWR0aCA9ICIxMDAlIiwgaGVpZ2h0ID0gIjQwMHB4IikKYGBgCgpQbG90dGluZyBudW1iZXIgb2YgdW5pcXVlIHNlcXVlbmNlcwoKYGBge3Igc2VxX251bWJlcnNfcGxvdF91bmlxdWUsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjMsIGVjaG89RkFMU0V9CnRhYl9zZXFzJEV4dHJhY3Rpb25fdGltZSA8LSBmYWN0b3IodGFiX3NlcXMkRXh0cmFjdGlvbl90aW1lLCBsZXZlbHM9YygiYmFzZWxpbmUiLCI2bW9udGhzIiwiMTJtb250aHMiKSkKZzQgPC0gZ2dwbG90KHRhYl9zZXFzLCBhZXMoZmlsbD1FeHRyYWN0aW9uX3RpbWUsIHk9VW5pcXVlLCB4PVBvcHVsYXRpb24pKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiU2VxdWVuY2UgbnVtYmVyIikgKwogIGdndGl0bGUoIlVuaXF1ZSBzZXF1ZW5jZSBudW1iZXJzIHBlciBzYW1wbGUiKSArCiAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoU291cmNlKSwgc2NhbGVzID0gImZyZWUiLCBkcm9wID0gVCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmc0CmBgYAoKClBsb3R0aW5nIG51bWJlciBvZiByZXByZXNlbnRhdGl2ZSAyIHNlcXVlbmNlcwoKYGBge3Igc2VxX251bWJlcnNfcGxvdF9yZXAyLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBlY2hvPUZBTFNFfQpnNCA8LSBnZ3Bsb3QodGFiX3NlcXMsIGFlcyhmaWxsPUV4dHJhY3Rpb25fdGltZSwgeT1SZXByZXNlbnRhdGl2ZV8yLCB4PVBvcHVsYXRpb24pKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiU2VxdWVuY2UgbnVtYmVyIikgKwogIGdndGl0bGUoIlJlcHJlc2VudGF0aXZlMiBzZXF1ZW5jZSBudW1iZXJzIHBlciBzYW1wbGUiKSArCiAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoU291cmNlKSwgc2NhbGVzID0gImZyZWUiLCBkcm9wID0gVCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmc0CmBgYAoKClBsb3R0aW5nIG51bWJlciBvZiBJZ2JsYXN0IGlkZW50aWZpZWQgc2VxdWVuY2VzCgoKYGBge3Igc2VxX251bWJlcnNfcGxvdCwgZmlnLndpZHRoPTEwLCBmaWcuYXNwPTAuMywgZWNobz1GQUxTRX0KZzQgPC0gZ2dwbG90KHRhYl9zZXFzLCBhZXMoZmlsbD1FeHRyYWN0aW9uX3RpbWUsIHk9SWdibGFzdCwgeD1Qb3B1bGF0aW9uKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlNlcXVlbmNlIG51bWJlciIpICsKICBnZ3RpdGxlKCJJZ2JsYXN0IGlkZW50aWZpZWQgc2VxdWVuY2UgbnVtYmVyIHBlciBzYW1wbGUiKSArCiAgZmFjZXRfZ3JpZChjb2xzPXZhcnMoU291cmNlKSwgc2NhbGVzID0gImZyZWUiLCBkcm9wID0gVCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmc0CmBgYAoKCgpgYGB7ciByZWFkX2RhdGEsIGluY2x1ZGU9RkFMU0V9CiMgUmVhZGluZyBkYXRhIHRhYmxlcyBhbmQgY2VhdGluZyBvdXRwdXQgZm9sZGVycwpkYXRhZGlyIDwtICIuIgpvdXRkaXIgPC0gInJlcGVydG9pcmVfY29tcGFyaXNvbiIKIyBzZXR3ZCB0byByZXN1bHRzIGZvbGRlciAoY29udGFpbmluZyBhbGFrYXphbSwgc2hhemFtLCBldGMuIGZvbGRlcnMpCiMjIyBSZWFkIGFsbCB0aGUgdGFibGVzIGFzIHByb2R1Y2VkIGJ5IHRoZSBwaXBlbGluZSBpbiB0aGUgY3VycmVudCBmb2xkZXIgYW5kIGpvaW5zIHRoZW0gdG9nZXRoZXIgaW4gdGhlIGRmX2FsbCBkYXRhZnJhbWUKI2FsbF9maWxlcyA8LSBzeXN0ZW0ocGFzdGUwKCJmaW5kICciLGRhdGFkaXIsIicgLW5hbWUgJypnZXJtLXBhc3MudHN2JyIpLCBpbnRlcm49VCkKZGlyLmNyZWF0ZShvdXRkaXIpCmRpdmVyc2l0eV9kaXIgPC0gcGFzdGUob3V0ZGlyLCAiRGl2ZXJzaXR5Iiwgc2VwPSIvIikKYWJ1bmRhbmNlX2RpciA8LSBwYXN0ZShvdXRkaXIsICJBYnVuZGFuY2UiLCBzZXA9Ii8iKQp2ZmFtaWx5X2RpciA8LSBwYXN0ZShvdXRkaXIsICJWX2ZhbWlseSIsIHNlcD0iLyIpCmlzb3R5cGVfZGlyIDwtIHBhc3RlKG91dGRpciwgIklzb3R5cGUiLCBzZXA9Ii8iKQpkaXIuY3JlYXRlKGRpdmVyc2l0eV9kaXIpCmRpci5jcmVhdGUoYWJ1bmRhbmNlX2RpcikKZGlyLmNyZWF0ZSh2ZmFtaWx5X2RpcikKZGlyLmNyZWF0ZShpc290eXBlX2RpcikKIyBHZW5lcmF0ZSBvbmUgYmlnIGRhdGFmcmFtZSBmcm9tIGFsbCBwYXRpZW50IGRhdGFmcmFtZXMKI2RmX2FsbCA9IGRhdGEuZnJhbWUoKQojZm9yIChmaWxlIGluIGFsbF9maWxlcyl7CiMgICAgZm5hbWUgPSBmaWxlCiMgICAgcHJpbnQoZm5hbWUpCiMgICAgZGZfcGF0IDwtIHJlYWQuY3N2KGZuYW1lLCBzZXA9Ilx0IikKIyAgICBkZl9hbGwgPC0gcmJpbmQoZGZfYWxsLCBkZl9wYXQpCiN9CiN3cml0ZS50YWJsZShkZl9hbGwsIHBhc3RlMChvdXRkaXIsIi9hbGxfZGF0YS50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGU9Riwgcm93Lm5hbWVzID0gRiwgY29sLm5hbWVzID0gVCkKZGZfYWxsIDwtIHJlYWQuY3N2KCIuLi9yZXBlcnRvaXJlX2FuYWx5c2lzL3JlcGVydG9pcmVfY29tcGFyaXNvbi9hbGxfZGF0YS50c3YiLCBzZXA9Ilx0IikKCiMgUmVtb3ZlIHVuZGVyc2NvcmVzIGluIHRoZXNlIGNvbHVtbnMKZGZfYWxsJHRyZWF0bWVudCA8LSBzYXBwbHkoZGZfYWxsJHRyZWF0bWVudCwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJHNvdXJjZSA8LSBzYXBwbHkoZGZfYWxsJHNvdXJjZSwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJGV4dHJhY3RfdGltZSA8LSBzYXBwbHkoZGZfYWxsJGV4dHJhY3RfdGltZSwgZnVuY3Rpb24oeCkgc3RyX3JlcGxhY2UoYXMuY2hhcmFjdGVyKHgpLCAiXyIsICIiKSkKZGZfYWxsJHBvcHVsYXRpb24gPC0gc2FwcGx5KGRmX2FsbCRwb3B1bGF0aW9uLCBmdW5jdGlvbih4KSBzdHJfcmVwbGFjZShhcy5jaGFyYWN0ZXIoeCksICJfIiwgIiIpKQojIEFubm90YXRlIHNhbXBsZSBhbmQgc2FtcGxlcG9wIChzYW1wbGUgKyBwb3B1bGF0aW9uKSBieSBhZGQgaW5nIGFsbCB0aGUgY29uZGl0aW9ucwpkZl9hbGwkc2FtcGxlIDwtIGFzLmZhY3RvcihwYXN0ZShkZl9hbGwkdHJlYXRtZW50LCBkZl9hbGwkZXh0cmFjdF90aW1lLCBkZl9hbGwkc291cmNlLCBzZXA9Il8iKSkKZGZfYWxsJHNhbXBsZV9wb3AgPC0gYXMuZmFjdG9yKHBhc3RlKGRmX2FsbCR0cmVhdG1lbnQsIGRmX2FsbCRleHRyYWN0X3RpbWUsIGRmX2FsbCRzb3VyY2UsIGRmX2FsbCRwb3B1bGF0aW9uLCBzZXA9Il8iKSkKIyBTZXQgbnVtYmVyIG9mIGJvb3Ryc3RyYXBzCm5ib290ID0gMjAwCgojIFJlbW92aW5nIENsYWRyaWJpbl82bW9udGhzX0NMQUQ0X04gYmVjYXVzZSBvZiB0b28gbGl0dGxlIHNlcXVlbmNlcwpkZl9hbGwgPC0gZGZfYWxsWyEoZGZfYWxsJHNhbXBsZV9wb3A9PSJDbGFkcmliaW5fNm1vbnRoc19DTEFENF9OIiksXQoKYGBgCgojIENsb25hbCBhYnVuZGFuY2UKCkZvciBwbG90dGluZyB0aGUgY2xvbmFsIGFidW5kYW5jZSwgdGhlIGNsb25lcyB3ZXJlIG9yZGVyZWQgYnkgc2l6ZSBmcm9tIGJpZ2dlciBjbG9uZXMgdG8gc21hbGxlciBjbG9uZXMgKHgtYXhpcywgUmFuaykuClRoZSBBYnVuZGFuY2Ugb2YgZWFjaCBjbG9uZSB3YXMgcmVwcmVzZW50ZWQgYXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdW5pcXVlIHNlcXVlbmNlcyBpbiB0aGUgY2xvbmUsIHdpdGggcmVzcGVjdCB0byB0aGUgdG90YWwKbnVtYmVyIG9mIHVuaXF1ZSBzZXF1ZW5jZXMgaW4gdGhhdCBzdWJqZWN0IChCeSBQYXRpZW50KSBvciBpbiB0aGUgQi1jZWxsIG9yIFQtY2VsbCBzYW1wbGUgKEJ5IENlbGwgUG9wdWxhdGlvbikuCgpUbyBjb3JyZWN0IGZvciB0aGUgZGlmZmVyZW50IG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gZWFjaCBvZiB0aGUgc2FtcGxlcywgdGhlIEJvb3RzdHJhcHBpbmcgdGVjaG5pcXVlIHdhcyBlbXBsb3llZCwKaW4gd2hpY2ggYHIgbmJvb3RgIHJhbmRvbSBib290c3RyYXAgc2FtcGxlcyB3ZXJlIHRha2VuLCB3aXRoIHNpemUgdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgaW4gdGhlIHNhbXBsZSB3aXRoIGxlc3Mgc2VxdWVuY2VzIChOKS4KVGhlIHNvbGlkIGxpbmUgc2hvd3MgdGhlIG1lYW4gQWJ1bmRhbmNlIG9mIHRoZSBib290c3RyYXAgc2FtcGxlcywgd2hlcmVhcyB0aGUgdHJhbnNwYXJlbnQgYXJlYSBzaG93cyB0aGUgZnVsbCBBYnVuZGFuY2UKcmFuZ2Ugb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGVzLgoKQWxsIGNsb25hbCBhYnVuZGFuY2UgcGxvdHMgYW5kIHRhYmxlcyB3aXRoIGFidW5kYW5jZSB2YWx1ZXMgY2FuIGJlIGZvdW5kIHVuZGVyIGByZXBlcnRvaXJlX2FuYWx5c2lzL0FidW5kYW5jZWAuCgojIyBDbG9uYWwgYWJ1bmRhbmNlIHBlciBzdWJqZWN0CmBgYHtyIGNsb25hbF9hYnVuZGFuY2UsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9CmFidW5kIDwtIGVzdGltYXRlQWJ1bmRhbmNlKGRmX2FsbCwgZ3JvdXAgPSAic2FtcGxlIiwgY2k9MC45NSwgbmJvb3Q9bmJvb3QpCmFidW5kQGFidW5kYW5jZSR0cmVhdG1lbnQgPC0gc2FwcGx5KGFidW5kQGFidW5kYW5jZSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQphYnVuZEBhYnVuZGFuY2UkdGltZV9wb2ludCA8LSBzYXBwbHkoYWJ1bmRAYWJ1bmRhbmNlJHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmFidW5kQGFidW5kYW5jZSRwYXRpZW50IDwtIHNhcHBseShhYnVuZEBhYnVuZGFuY2Ukc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKYWJ1bmRfbWFpbiA8LSBwYXN0ZTAoIkNsb25hbCBhYnVuZGFuY2UgKE49IiwgYWJ1bmRAblsxXSwgIikiKQpgYGAKYGBge3IgY2xvbmFsX2FidW5kYW5jZTIsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTEyLCBlY2hvPUZBTFNFfQpwX2NhIDwtIGdncGxvdChhYnVuZEBhYnVuZGFuY2UsIGFlcyh4ID0gcmFuaywgeSA9IHAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc2FtcGxlKSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBsb3dlciwKICAgICAgICAgICAgICAgICAgICB5bWF4ID0gdXBwZXIsIGZpbGwgPSB0aW1lX3BvaW50KSwgYWxwaGEgPSAwLjQpICsKICAgIGdlb21fbGluZShhZXMoY29sb3IgPSB0aW1lX3BvaW50KSkgKwogICAgZ2d0aXRsZShhYnVuZF9tYWluKSArCiAgICB4bGFiKCJSYW5rIikgKyB5bGFiKCJBYnVuZGFuY2UiKSArCiAgICBzY2FsZV94X2xvZzEwKGxpbWl0cyA9IE5VTEwsCiAgICAgICAgICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54KSwKICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6dHJhbnNfZm9ybWF0KCJsb2cxMCIsIHNjYWxlczo6bWF0aF9mb3JtYXQoMTBeLngpKSkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhwYXRpZW50KSwgcm93cyA9IHZhcnModHJlYXRtZW50KSwgc2NhbGVzPSJmcmVlIiwgZHJvcCA9IFQpCnBfY2EKYGBgCgpgYGB7ciBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90PXBfY2EsIGZpbGVuYW1lID0gcGFzdGUwKGFidW5kYW5jZV9kaXIsIi9DbG9uYWxfYWJ1bmRhbmNlX3N1YmplY3QucGRmIiksIGRldmljZT0icGRmIiwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3Q9cF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2Vfc3ViamVjdC5wbmciKSwgZGV2aWNlPSJwbmciLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQp3cml0ZS50YWJsZShhYnVuZEBhYnVuZGFuY2UsIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfYWJ1bmRhbmNlX2RhdGFfc3ViamVjdC50c3YiKSwgc2VwPSJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgojIyMgQ2FsY3VsYXRlIGFyZWEgdW5kZXIgdGhlIGN1cnZlIGZvciBhYnVuZGFuY2UKCmBgYHtyIGF1Y30KCmBgYAoKIyMgQ291bnQgY2xvbmVzIHBlciBzdWJqZWN0CgpgYGB7ciBjb3VudF9jbG9uZXN9CmRmX2NvdW50Y2xvbmVzX2NvcHkgPC0gY291bnRDbG9uZXMoZGZfYWxsLGdyb3Vwcz0ic2FtcGxlIixjb3B5ID0gImR1cGxpY2F0ZV9jb3VudCIpCmRmX2NvdW50Y2xvbmVzX2NvcHkkdHJlYXRtZW50IDwtIHNhcHBseShkZl9jb3VudGNsb25lc19jb3B5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCmRmX2NvdW50Y2xvbmVzX2NvcHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZGZfY291bnRjbG9uZXNfY29weSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpkZl9jb3VudGNsb25lc19jb3B5JHBhdGllbnQgPC0gc2FwcGx5KGRmX2NvdW50Y2xvbmVzX2NvcHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKd3JpdGUudGFibGUoZGZfY291bnRjbG9uZXNfY29weSwgZmlsZSA9IHBhc3RlMChhYnVuZGFuY2VfZGlyLCAiL0Nsb25hbF9udW1iZXJzX2RhdGFfc3ViamVjdC50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMjIENsb25hbCBhYnVuZGFuY2UgcGVyIGNlbGwgcG9wdWxhdGlvbgoKSWYgZGlmZmVyZW50IHR5cGVzIG9mIEItY2VsbCBvciBULWNlbGwgcG9wdWxhdGlvbnMgYXJlIHByb3ZpZGVkLCBoZXJlCnRoZSBjbG9uYWwgYWJ1bmRhbmNlIGlzIHBsb3R0ZWQgZm9yIGVhY2ggcGF0aWVudCBhbmQgQiAvIFQtY2VsbCBwb3B1bGF0aW9uLgoKYGBge3IgY2xvbmFsX2FidW5kYW5jZV9wb3AsIGVjaG89RkFMU0UsIGluY2x1ZGU9RkFMU0V9CgphYnVuZF9wb3AgPC0gZXN0aW1hdGVBYnVuZGFuY2UoZGZfYWxsLCBjbG9uZT0iY2xvbmVfaWQiLCBncm91cCA9ICJzYW1wbGVfcG9wIiwgY2k9MC45NSwgbmJvb3Q9bmJvb3QpCmFidW5kX3BvcEBhYnVuZGFuY2UkdHJlYXRtZW50IDwtIHNhcHBseShhYnVuZF9wb3BAYWJ1bmRhbmNlJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQphYnVuZF9wb3BAYWJ1bmRhbmNlJHRpbWVfcG9pbnQgPC0gc2FwcGx5KGFidW5kX3BvcEBhYnVuZGFuY2Ukc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmFidW5kX3BvcEBhYnVuZGFuY2UkcGF0aWVudCA8LSBzYXBwbHkoYWJ1bmRfcG9wQGFidW5kYW5jZSRzYW1wbGVfcG9wLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKYWJ1bmRfcG9wQGFidW5kYW5jZSRwb3B1bGF0aW9uIDwtIHNhcHBseShhYnVuZF9wb3BAYWJ1bmRhbmNlJHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzRdKQphYnVuZF9tYWluIDwtIHBhc3RlMCgiQ2xvbmFsIGFidW5kYW5jZSAoTj0iLCBhYnVuZF9wb3BAblsxXSwgIikiKQpgYGAKYGBge3IgY2xvbmFsX2FidW5kYW5jZV9wb3AyLCBmaWcud2lkdGg9MTIsIGVjaG89RkFMU0V9CnBvcF9jYSA8LSBnZ3Bsb3QoYWJ1bmRfcG9wQGFidW5kYW5jZSwgYWVzKHggPSByYW5rLCB5ID0gcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IHNhbXBsZV9wb3ApKSArCiAgICBnZW9tX3JpYmJvbihhZXMoeW1pbiA9IGxvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSB1cHBlciwgZmlsbCA9IHRpbWVfcG9pbnQpLCBhbHBoYSA9IDAuNCkgKwogICAgZ2VvbV9saW5lKGFlcyhjb2xvciA9IHRpbWVfcG9pbnQpKSArCiAgICBnZ3RpdGxlKGFidW5kX21haW4pICsKICAgIHhsYWIoIlJhbmsiKSArIHlsYWIoIkFidW5kYW5jZSIpICsKICAgIHNjYWxlX3hfbG9nMTAobGltaXRzID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzY2FsZXM6OnRyYW5zX2JyZWFrcygibG9nMTAiLCBmdW5jdGlvbih4KSAxMF54KSwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBzY2FsZXM6OnRyYW5zX2Zvcm1hdCgibG9nMTAiLCBzY2FsZXM6Om1hdGhfZm9ybWF0KDEwXi54KSkpICsKICAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIHNjYWxlcz0iZnJlZSIsIGRyb3AgPSBUKQpwb3BfY2EKYGBgCmBgYHtyIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZShwbG90PXBvcF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2VfcGF0aWVudF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90PXBvcF9jYSwgZmlsZW5hbWUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwiL0Nsb25hbF9hYnVuZGFuY2VfcGF0aWVudF9wb3B1bGF0aW9uLnBuZyIpLCBkZXZpY2U9InBuZyIsCiAgICAgICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzPSJjbSIpCndyaXRlLnRhYmxlKGFidW5kX3BvcEBhYnVuZGFuY2UsIGZpbGUgPSBwYXN0ZTAoYWJ1bmRhbmNlX2RpciwgIi9DbG9uYWxfYWJ1bmRhbmNlX2RhdGFfY2VsbF9wb3B1bGF0aW9uLnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQoKYGBgCgojIENsb25hbCBkaXZlcnNpdHkKClRoZSBjbG9uYWwgZGl2ZXJzaXR5ICREJCBvZiB0aGUgcmVwZXJ0b2lyZSB3YXMgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGdlbmVyYWwgZm9ybXVsYSBvZiBIaWxsIERpdmVyc2l0eQpudW1iZXJzOgoKJCQKXGJlZ2lue2FsaWduZWR9CiAgICBee3F9RCA9IFxsZWZ0KCBcc3VtX3tpPTF9XlJwX2lecSBccmlnaHQpXnsxLygxLXEpfQpcZW5ke2FsaWduZWR9CiQkCgp3aGVyZToKCiogJHBfaSQgaXMgdGhlIHByb3BvcnRpb24gb2YgdW5pcXVlIHNlcXVlbmNlcyBiZWxvbmdpbmcgdG8gY2xvbmUgJGkkLgoqICRxJCBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgZGlmZmVyZW50IGRpdmVyc2l0eSBudW1iZXJzLgoqICRSJCBpcyB0aGUgUmljaG5lc3MsIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGNsb25lcyBpbiB0aGUgc2FtcGxlLgoKQXQgJHE9MSQgdGhlIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIGxpbWl0IHRvIHplcm8gZXF1YWxzIHRoZSBleHBvbmVudGlhbCBvZiB0aGUgU2hhbm5vbiBFbnRyb3B5OgoKJCQKXGJlZ2lue2FsaWduZWR9CiAgICBeezF9RCA9IGV4cCBcbGVmdCggIFxzdW1fe2k9MX1eUnBfaSBsbihwX2kpICBccmlnaHQpClxlbmR7YWxpZ25lZH0KJCQKClRoZSBpbnR1aXRpb24gYWJvdXQgdGhlIGRpZmZlcmVudCBIaWxsIERpdmVyc2l0eSB2YWx1ZXMgaXMgdGhlIGZvbGxvd2luZzoKCiogQXQgJHE9MCQgdGhlIGRpdmVyc2l0eSBpbmRleCBlcXVhbHMgdGhlIG51bWJlciBvZiBjbG9uZXMgaW4gdGhlIHNhbXBsZS4KKiBBdCAkcT0xJCB0aGUgZGl2ZXJzaXR5IGluZGV4IGlzIHRoZSBnZW9tZXRyaWMgbWVhbiBvZiB0aGUgY2xvbmVzIGluIHRoZSBzYW1wbGUsCndlaWdodGVkIGJ5IHRoZWlyIHByb3BvcnRpb24gaW4gdGhlIHNhbXBsZS4KKiBBdCAkcT4xJCBtb3JlIHdlaWdodCBpcyBnaXZlbiB0byB0aGUgY2xvbmVzIHdpdGggaGlnaGVyIHByb3BvcnRpb25zIGluIHRoZSBzYW1wbGUuCgpBbGwgY2xvbmFsIGRpdmVyc2l0eSBwbG90cyBhbmQgdGFibGVzIHdpdGggZGl2ZXJzaXR5IHZhbHVlcyBjYW4gYmUgZm91bmQgdW5kZXIgYHJlcGVydG9pcmVfYW5hbHlzaXMvRGl2ZXJzaXR5YC4KVG8gY29ycmVjdCBmb3IgdGhlIGRpZmZlcmVudCBudW1iZXIgb2Ygc2VxdWVuY2VzIGluIGVhY2ggb2YgdGhlIHNhbXBsZXMsIHRoZSBCb290c3RyYXBwaW5nIHRlY2huaXF1ZSB3YXMgZW1wbG95ZWQsCmluIHdoaWNoIGByIG5ib290YCByYW5kb20gYm9vdHN0cmFwIHNhbXBsZXMgd2VyZSB0YWtlbiwgd2l0aCBzaXplIHRoZSBudW1iZXIgb2Ygc2VxdWVuY2VzIGluIHRoZSBzYW1wbGUgd2l0aCBsZXNzIHNlcXVlbmNlcyAoTikuClRoZSBzb2xpZCBsaW5lIHNob3dzIHRoZSBtZWFuIERpdmVyc2l0eSBvZiB0aGUgYm9vdHN0cmFwIHNhbXBsZXMsIHdoZXJlYXMgdGhlIHRyYW5zcGFyZW50IGFyZWEgc2hvd3MgdGhlIGZ1bGwgRGl2ZXJzaXR5CnJhbmdlIG9mIHRoZSBib290c3RyYXAgc2FtcGxlcy4KCgojIyBDbG9uYWwgZGl2ZXJzaXR5IHBlciBzdWJqZWN0CmBgYHtyIGNsb25hbF9kaXZlcnNpdHksIGVjaG8gPSBGQUxTRSwgaW5jbHVkZT1GQUxTRX0Kc2FtcGxlX2RpdiA8LSBhbHBoYURpdmVyc2l0eShhYnVuZCwgZ3JvdXA9InNhbXBsZSIsIG1pbl9xPTAsIG1heF9xPTQsIHN0ZXBfcT0wLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2k9MC45NSwgbmJvb3Q9bmJvb3QpCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSAoTj0iLCBzYW1wbGVfZGl2QG5bMV0sICIpIikKc2FtcGxlX2RpdkBkaXZlcnNpdHkkdHJlYXRtZW50IDwtIHNhcHBseShzYW1wbGVfZGl2QGRpdmVyc2l0eSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpzYW1wbGVfZGl2QGRpdmVyc2l0eSR0aW1lX3BvaW50IDwtIHNhcHBseShzYW1wbGVfZGl2QGRpdmVyc2l0eSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpzYW1wbGVfZGl2QGRpdmVyc2l0eSRwYXRpZW50IDwtIHNhcHBseShzYW1wbGVfZGl2QGRpdmVyc2l0eSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpgYGAKYGBge3IgY2xvbmFsX2RpdmVyc2l0eTIsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTEyLCBlY2hvID0gRkFMU0V9CmRpdl9wIDwtIGdncGxvdChzYW1wbGVfZGl2QGRpdmVyc2l0eSwgYWVzKHggPSBxLCB5ID0gZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc2FtcGxlKSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBkX2xvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBkX3VwcGVyLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSB0aW1lX3BvaW50KSwgYWxwaGEgPSAwLjQpICsKICAgIGdlb21fbGluZShhZXMoY29sb3IgPSB0aW1lX3BvaW50KSkgKwogICAgeGxhYigicSIpICsgeWxhYihleHByZXNzaW9uKCIiXnEgKiBEKSkgKwogICAgZ2d0aXRsZShzYW1wbGVfbWFpbikgKwogICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCkpCmRpdl9wCmBgYApgYGB7ciBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90PWRpdl9wLCBmaWxlbmFtZT1wYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9wYXRpZW50X2dyaWQucG5nIiksIGRldmljZT0icG5nIiwgd2lkdGggPSAyNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3Q9ZGl2X3AsIGZpbGVuYW1lPXBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3BhdGllbnRfZ3JpZC5wZGYiKSwgZGV2aWNlPSJwZGYiLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpgYGAKCiMjIyBDbG9uYWwgZGl2ZXJzaXR5IGF0IHNwZWNpZmljIHEgdmFsdWVzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIyBxPTEgey19CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5X3ExLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LCBlY2hvID0gRkFMU0V9CnNhbXBsZV9kaXZAZGl2ZXJzaXR5JHRpbWVfcG9pbnQgPC0gZmFjdG9yKHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHRpbWVfcG9pbnQsIGxldmVscz1jKCJiYXNlbGluZSIsIjZtb250aHMiLCIxMm1vbnRocyIpKQpzYW1wbGVfZGl2X3ExIDwtIHNhbXBsZV9kaXZAZGl2ZXJzaXR5W3doaWNoKHNhbXBsZV9kaXZAZGl2ZXJzaXR5JHEgPT0gMSksXQpzYW1wbGVfbWFpbiA8LSBwYXN0ZTAoIlNhbXBsZSBkaXZlcnNpdHkgYXQgcT0xIChOPSIsIHNhbXBsZV9kaXZAblsxXSwgIikiKQpkb2RnZSA8LSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkKZHExIDwtIGdncGxvdChzYW1wbGVfZGl2X3ExLCBhZXMoeT1kLCB4PXRpbWVfcG9pbnQpKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvcj1wYXRpZW50LGdyb3VwPXRpbWVfcG9pbnQpLHBvc2l0aW9uPWRvZGdlLCBzdGF0PSJpZGVudGl0eSIsIHNpemUgPSAzKSArCiAgICAjZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1kLWRfc2QsIHltYXg9ZCtkX3NkKSwgd2lkdGggPSAuMDUsIHBvc2l0aW9uPWRvZGdlKSArCiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPXBhdGllbnQsY29sb3I9cGF0aWVudCkpICsKICAgIHhsYWIoIiIpICsgeWxhYigiRGl2ZXJzaXR5IChxPTEpIikgKwogICAgZ2d0aXRsZShzYW1wbGVfbWFpbikgKwogICAgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIkFjY2VudCIpKwogICAgI2ZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCBkcm9wPVQsIHNwYWNlPSJmcmVlIiwgc2NhbGVzID0gImZyZWUiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpkcTEKYGBgCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3Rfc3ViamVjdF9wYWlyZWQucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDQsIHVuaXRzPSJjbSIpCmdnc2F2ZShwbG90ID0gZHExLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3Rfc3ViamVjdF9wYWlyZWQucGRmIiksIGRldmljZT0icGRmIiwKICAgICAgICB3aWR0aCA9IDUsIGhlaWdodCA9IDQsIHVuaXRzPSJjbSIpCmBgYAoKIyMjIyBxPTAgey19CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5X3EwLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD01LCBlY2hvID0gRkFMU0V9CnNhbXBsZV9kaXZfcTAgPC0gc2FtcGxlX2RpdkBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2RpdkBkaXZlcnNpdHkkcSA9PSAwKSxdCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSBhdCBxPTAgKE49Iiwgc2FtcGxlX2RpdkBuWzFdLCAiKSIpCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpkcTAgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTAsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPXBhdGllbnQsZ3JvdXA9dGltZV9wb2ludCkscG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDMpICsKICAgICNnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWQtZF9zZCwgeW1heD1kK2Rfc2QpLCB3aWR0aCA9IC4wNSwgcG9zaXRpb249ZG9kZ2UpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9cGF0aWVudCxjb2xvcj1wYXRpZW50KSkgKwogICAgeGxhYigiIikgKyB5bGFiKCJEaXZlcnNpdHkgKHE9MCkiKSArCiAgICBnZ3RpdGxlKHNhbXBsZV9tYWluKSArCiAgICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiQWNjZW50IikrCiAgICAjZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIGRyb3A9VCwgc3BhY2U9ImZyZWUiLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmRxMApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHEwLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3EwX3Rlc3Rfc3ViamVjdF9wYWlyZWQucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGRxMCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMF90ZXN0X3N1YmplY3RfcGFpcmVkLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyNSwgaGVpZ2h0ID0gNiwgdW5pdHM9ImNtIikKYGBgCgojIyBDbG9uYWwgZGl2ZXJzaXR5IHBlciBjZWxsIHBvcHVsYXRpb24KCmBgYHtyIGNsb25hbF9kaXZlcnNpdHlfcG9wLCBmaWcud2lkdGg9MTIsIGVjaG8gPSBGQUxTRSwgbWVzc2FnZT1GQUxTRX0Kc2FtcGxlX2Rpdl9wb3AgPC0gYWxwaGFEaXZlcnNpdHkoYWJ1bmRfcG9wLCBncm91cD0ic2FtcGxlX3BvcCIsIG1pbl9xPTAsIG1heF9xPTQsIHN0ZXBfcT0wLjA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpPTAuOTUsIG5ib290PW5ib290KQpzYW1wbGVfbWFpbiA8LSBwYXN0ZTAoIlNhbXBsZSBkaXZlcnNpdHkgKE49Iiwgc2FtcGxlX2Rpdl9wb3BAblsxXSwgIikiKQpzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkdHJlYXRtZW50IDwtIHNhcHBseShzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMV0pCnNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSR0aW1lX3BvaW50IDwtIHNhcHBseShzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCnNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSRwYXRpZW50IDwtIHNhcHBseShzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCnNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSRwb3B1bGF0aW9uIDwtIHNhcHBseShzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkc2FtcGxlX3BvcCwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbNF0pCmRpdl9wb3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eSwgYWVzKHggPSBxLCB5ID0gZCwgZ3JvdXAgPSBzYW1wbGVfcG9wKSkgKwogICAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBkX2xvd2VyLAogICAgICAgICAgICAgICAgICAgIHltYXggPSBkX3VwcGVyLCBmaWxsID0gdGltZV9wb2ludCksIGFscGhhID0gMC40KSArCiAgICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gdGltZV9wb2ludCkpICsKICAgIHhsYWIoInEiKSArIHlsYWIoZXhwcmVzc2lvbigiIl5xICogRCkpICsKICAgIGdndGl0bGUoc2FtcGxlX21haW4pICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIHNjYWxlcz0iZnJlZSIsIGRyb3AgPSBUKQpkaXZfcG9wCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZShwbG90ID0gZGl2X3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9zdWJqZWN0X3BvcHVsYXRpb24uc3ZnIiksIGRldmljZT0ic3ZnIiwKICAgICAgICB3aWR0aCA9IDI3LCBoZWlnaHQgPSAyMCwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBkaXZfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3N1YmplY3RfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjcsIGhlaWdodCA9IDIwLCB1bml0cz0iY20iKQpgYGAKCiMjIyBDbG9uYWwgZGl2ZXJzaXR5IHBlciBwb3B1bGF0aW9uIGF0IHNwZWNpZmljIHEgdmFsdWVzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIyBxPTEgey19CgpgYGB7ciBjbG9uYWxfZGl2ZXJzaXR5X3ExX3BvcCwgZWNobyA9IEZBTFNFfQpzYW1wbGVfZGl2X3ExIDwtIHNhbXBsZV9kaXZfcG9wQGRpdmVyc2l0eVt3aGljaChzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHkkcSA9PSAxKSxdCnNhbXBsZV9tYWluIDwtIHBhc3RlMCgiU2FtcGxlIGRpdmVyc2l0eSBhdCBxPTEgKE49Iiwgc2FtcGxlX2Rpdl9wb3BAblsxXSwgIikiKQpkb2RnZSA8LSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSkKZHExX3BvcCA8LSBnZ3Bsb3Qoc2FtcGxlX2Rpdl9xMSwgYWVzKHk9ZCwgeD10aW1lX3BvaW50KSkgKwogICAgZ2VvbV9wb2ludChwb3NpdGlvbj1kb2RnZSwgc3RhdD0iaWRlbnRpdHkiLCBzaXplID0gMykgKwogICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1kLWRfc2QsIHltYXg9ZCtkX3NkKSwgd2lkdGggPSAuMiwgcG9zaXRpb249ZG9kZ2UpICsKICAgIHhsYWIoIiIpICsgeWxhYigiRGl2ZXJzaXR5IChxPTEpIikgKwogICAgZ2d0aXRsZShzYW1wbGVfbWFpbikgKwogICAgZmFjZXRfZ3JpZChjb2xzPXZhcnMocGF0aWVudCksIHJvd3M9dmFycyhwb3B1bGF0aW9uKSwgZHJvcD1ULCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpCmRxMV9wb3AKYGBgCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9Cmdnc2F2ZShwbG90ID0gZHExX3BvcCwgZmlsZW5hbWUgPSBwYXN0ZTAoZGl2ZXJzaXR5X2RpciwiL0RpdmVyc2l0eV9xMV90ZXN0X3BvcHVsYXRpb24ucG5nIiksIGRldmljZT0icG5nIiwKICAgICAgICB3aWR0aCA9IDIwLCBoZWlnaHQgPSAxNSwgdW5pdHM9ImNtIikKZ2dzYXZlKHBsb3QgPSBkcTFfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3ExX3Rlc3RfcG9wdWxhdGlvbi5wZGYiKSwgZGV2aWNlPSJwZGYiLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1LCB1bml0cz0iY20iKQpgYGAKCiMjIyMgcT0wIHstfQoKYGBge3IgY2xvbmFsX2RpdmVyc2l0eV9xMF9wb3AsIGVjaG8gPSBGQUxTRX0Kc2FtcGxlX2Rpdl9xMCA8LSBzYW1wbGVfZGl2X3BvcEBkaXZlcnNpdHlbd2hpY2goc2FtcGxlX2Rpdl9wb3BAZGl2ZXJzaXR5JHEgPT0gMCksXQpzYW1wbGVfbWFpbiA8LSBwYXN0ZTAoIlNhbXBsZSBkaXZlcnNpdHkgYXQgcT0wIChOPSIsIHNhbXBsZV9kaXZfcG9wQG5bMV0sICIpIikKZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpCmRxMF9wb3AgPC0gZ2dwbG90KHNhbXBsZV9kaXZfcTAsIGFlcyh5PWQsIHg9dGltZV9wb2ludCkpICsKICAgIGdlb21fcG9pbnQocG9zaXRpb249ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZSA9IDMpICsKICAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49ZC1kX3NkLCB5bWF4PWQrZF9zZCksIHdpZHRoID0gLjIsIHBvc2l0aW9uPWRvZGdlKSArCiAgICB4bGFiKCIiKSArIHlsYWIoIkRpdmVyc2l0eSAocT0wKSIpICsKICAgIGdndGl0bGUoc2FtcGxlX21haW4pICsKICAgIGZhY2V0X2dyaWQoY29scz12YXJzKHBhdGllbnQpLCByb3dzPXZhcnMocG9wdWxhdGlvbiksIGRyb3A9VCwgc2NhbGVzID0gImZyZWUiKSArCiAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpkcTBfcG9wCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KZ2dzYXZlKHBsb3QgPSBkcTBfcG9wLCBmaWxlbmFtZSA9IHBhc3RlMChkaXZlcnNpdHlfZGlyLCIvRGl2ZXJzaXR5X3EwX3Rlc3RfcG9wdWxhdGlvbi5wbmciKSwgZGV2aWNlPSJwbmciLAogICAgICAgIHdpZHRoID0gMjAsIGhlaWdodCA9IDE1LCB1bml0cz0iY20iKQpnZ3NhdmUocGxvdCA9IGRxMF9wb3AsIGZpbGVuYW1lID0gcGFzdGUwKGRpdmVyc2l0eV9kaXIsIi9EaXZlcnNpdHlfcTBfdGVzdF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2U9InBkZiIsCiAgICAgICAgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMTUsIHVuaXRzPSJjbSIpCmBgYAoKIyBWIGdlbmUgdXNhZ2UKCiMjIFYgZ2VuZSBmYW1pbHkgdXNhZ2Ugey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpUaGUgViBnZW5lIHVzYWdlIChpbiBwZXJjZW50YWdlKSBpbiBlYWNoIG9mIHRoZSBzYW1wbGVzIGlzIHJlcHJlc2VudGVkIGJlbG93LiBBbGwgcGxvdHMgYW5kIHRhYmxlcyBjYW4gYmUgZm91bmQgW2hlcmVdKC4vcmVwZXJ0b2lyZV9jb21wYXJpc29uL1ZfZmFtaWx5LykuCgpHZW5lIGZhbWlseSB1c2FnZSBpcyBub3JtYWxpemVkIGJ5IHRoZSBudW1iZXIgb2YgY2xvbmVzLgoKIyMjIEJ5IHBhdGllbnQgey19CgpgYGB7ciwgZWNobz1GLGZpZy53aWR0aD02LCBmaWcuYXNwPTEsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImZhbWlseSIsIGNsb25lPSJjbG9uZV9pZCIpCmZhbWlseSR0cmVhdG1lbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpmYW1pbHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmZhbWlseSR0aW1lX3BvaW50IDwtIGZhY3RvcihmYW1pbHkkdGltZV9wb2ludCwgbGV2ZWxzPWMoImJhc2VsaW5lIiwiNm1vbnRocyIsIjEybW9udGhzIikpCmZhbWlseSRwYXRpZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKCmdnMSA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoZmlsbD1nZW5lLCB5PWNsb25lX2ZyZXEsIHg9dGltZV9wb2ludCkpICsgCiAgICAgICAgZ2VvbV9iYXIocG9zaXRpb249ImZpbGwiLCBzdGF0PSJpZGVudGl0eSIpICsKICAgICAgICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHBhdGllbnQpLCBkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkKCgpnMiA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoeD10aW1lX3BvaW50LCB5PWNsb25lX2ZyZXEsIGZpbGw9dGltZV9wb2ludCkpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICBnZ3RpdGxlKCJWIEdlbmUgRmFtaWx5IFVzYWdlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkgKwogICAgeWxhYigiRnJlcXVlbmN5IikgKwogICAgeGxhYigiIikgKwogICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhwYXRpZW50KSwgcm93cz12YXJzKGdlbmUpLGRyb3A9VCwgc2NhbGVzID0gImZyZWUiICkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJCbHVlcyIpCmdnMQpnMgpgYGAKCmBgYHtyLCBlY2hvPUZ9Cmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX0ZhbWlseV9kaXN0cmlidXRpb25fcGF0aWVudC5zdmciKSwgcGxvdCA9IGcyLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cyA9ICJjbSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX0ZhbWlseV9kaXN0cmlidXRpb25fcGF0aWVudC5wbmciKSwgcGxvdCA9IGcyLCB3aWR0aCA9IDI1LCBoZWlnaHQgPSA2LCB1bml0cyA9ICJjbSIpCndyaXRlLnRhYmxlKGZhbWlseSwgZmlsZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2ZhbWlseV9kaXN0cmlidXRpb25fZGF0YS50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCmBgYHtyLCBlY2hvPUYsZmlnLndpZHRoPTMsIGZpZy5hc3A9MS41LCBmaWcuYWxpZ249J2NlbnRlcid9CmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KQpnMyA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoeD10aW1lX3BvaW50LCB5PWNsb25lX2ZyZXEpKSArCiAgICBnZW9tX3BvaW50KGFlcyhjb2xvcj1wYXRpZW50LCBncm91cD10aW1lX3BvaW50KSxwb3NpdGlvbiA9ZG9kZ2UsIHN0YXQ9ImlkZW50aXR5Iiwgc2l6ZT0zKSArCiAgICBnZW9tX2xpbmUoYWVzKGdyb3VwPXBhdGllbnQsY29sb3I9cGF0aWVudCkpICsKICAgIGdndGl0bGUoIlYgR2VuZSBGYW1pbHkgVXNhZ2UiKSArCiAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTEpKSArCiAgICB5bGFiKCJGcmVxdWVuY3kiKSArCiAgICB4bGFiKCIiKSArCiAgICBmYWNldF9ncmlkKHJvd3M9dmFycyhnZW5lKSxkcm9wPVQsIHNjYWxlcyA9ICJmcmVlIiApICsKICAgICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICAgIHNjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZT0iQWNjZW50IikKZzMKYGBgCgojIyMgQnkgUG9wdWxhdGlvbiB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0wLjUsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZV9wb3AiLAogICAgICAgICAgICAgICAgICAgIG1vZGU9ImZhbWlseSIsIGNsb25lID0gImNsb25lX2lkIikKZmFtaWx5JHRyZWF0bWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpmYW1pbHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpmYW1pbHkkcGF0aWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzNdKQpmYW1pbHkkcG9wdWxhdGlvbiA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZV9wb3AsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzRdKQpnMiA8LSBnZ3Bsb3QoZmFtaWx5LCBhZXMoeD10aW1lX3BvaW50LCB5PWNsb25lX2ZyZXEsIGZpbGw9Z2VuZSkpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICAgIGdndGl0bGUoIlYgZ2VuZSBGYW1pbHkgVXNhZ2UiKSArCiAgICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEsIHZqdXN0PTEpKSArCiAgICB5bGFiKCJGcmVxdWVuY3kiKSArCiAgICB4bGFiKCIiKSArCiAgICBmYWNldF9ncmlkKGNvbHM9dmFycyhwYXRpZW50LHBvcHVsYXRpb24pLCByb3dzPXZhcnMoZ2VuZSkpICsKICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKZzIKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnRfcG9wdWxhdGlvbi5zdmciKSwgcGxvdCA9IGcyLAogICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCIvVl9GYW1pbHlfZGlzdHJpYnV0aW9uX3BhdGllbnRfcG9wdWxhdGlvbi5wbmciKSwgcGxvdCA9IGcyLAogICAgd2lkdGggPSAzMCwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKd3JpdGUudGFibGUoZmFtaWx5LCBmaWxlID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZmFtaWx5X2Rpc3RyaWJ1dGlvbl9kYXRhX3BvcHVsYXRpb24udHN2IiksIHNlcCA9ICJcdCIsCiAgICBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKIyMgViBnZW5lIHVzYWdlIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKVGhlIFYgZ2VuZSB1c2FnZSAoaW4gcGVyY2VudGFnZSkgaW4gZWFjaCBvZiB0aGUgc2FtcGxlcyBpcyByZXByZXNlbnRlZCBiZWxvdy4KQWxsIHBsb3RzIGFuZCB0YWJsZXMgY2FuIGJlIGZvdW5kIFtoZXJlXSguL3JlcGVydG9pcmVfY29tcGFyaXNvbi9WX2ZhbWlseS8pLgoKIyMjIEJ5IGNsb25lcyB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLjgsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImdlbmUiLCBjbG9uZSA9ICJjbG9uZV9pZCIpCmZhbWlseSR0cmVhdG1lbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzFdKQpmYW1pbHkkdGltZV9wb2ludCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbMl0pCmZhbWlseSRwYXRpZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVszXSkKZzIgPC0gZ2dwbG90KGZhbWlseSwgYWVzKHg9Z2VuZSwgeT1jbG9uZV9mcmVxLCBmaWxsPWdlbmUpKSArCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIpICsKICAgIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgICBnZ3RpdGxlKCJWIEdlbmUgRmFtaWx5IFVzYWdlIikgKwogICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xLCB2anVzdD0xKSkgKwogICAgeWxhYigiRnJlcXVlbmN5IikgKwogICAgeGxhYigiIikgKwogICAgZmFjZXRfd3JhcCh2YXJzKHBhdGllbnQpLCBzY2FsZXM9ImZyZWVfeCIsIG5jb2wgPSAxKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmcyCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2dlbmVfZGlzdHJpYnV0aW9uX2J5X2Nsb25lX3BhdGllbnQuc3ZnIiksIHBsb3QgPSBnMiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGZpbGVuYW1lID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZ2VuZV9kaXN0cmlidXRpb25fYnlfY2xvbmVfcGF0aWVudC5wbmciKSwgcGxvdCA9IGcyLCB3aWR0aCA9IDIwLCBoZWlnaHQgPSA0MCwgdW5pdHMgPSAiY20iKQp3cml0ZS50YWJsZShmYW1pbHksIGZpbGUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9nZW5lX2Rpc3RyaWJ1dGlvbl9ieV9jbG9uZV9kYXRhLnRzdiIpLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEYsIHJvdy5uYW1lcyA9IEYpCmBgYAoKIyMjIEJ5IHNlcXVlbmNlcyB7LX0KCmBgYHtyLCBlY2hvPUYsIGZpZy53aWR0aD0xMCwgZmlnLmFzcD0xLjgsIGZpZy5hbGlnbj0nY2VudGVyJ30KZmFtaWx5IDwtIGNvdW50R2VuZXMoZGZfYWxsLCBnZW5lPSJ2X2NhbGwiLCBncm91cHM9InNhbXBsZSIsIG1vZGU9ImdlbmUiKQpmYW1pbHkkdHJlYXRtZW50IDwtIHNhcHBseShmYW1pbHkkc2FtcGxlLCBmdW5jdGlvbih4KSB1bmxpc3Qoc3Ryc3BsaXQoYXMuY2hhcmFjdGVyKHgpLCAiXyIpKVsxXSkKZmFtaWx5JHRpbWVfcG9pbnQgPC0gc2FwcGx5KGZhbWlseSRzYW1wbGUsIGZ1bmN0aW9uKHgpIHVubGlzdChzdHJzcGxpdChhcy5jaGFyYWN0ZXIoeCksICJfIikpWzJdKQpmYW1pbHkkcGF0aWVudCA8LSBzYXBwbHkoZmFtaWx5JHNhbXBsZSwgZnVuY3Rpb24oeCkgdW5saXN0KHN0cnNwbGl0KGFzLmNoYXJhY3Rlcih4KSwgIl8iKSlbM10pCmcyIDwtIGdncGxvdChmYW1pbHksIGFlcyh4PWdlbmUsIHk9c2VxX2ZyZXEsIGZpbGw9Z2VuZSkpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikgKwogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICAgIGdndGl0bGUoIlYgR2VuZSBVc2FnZSIpICsKICAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsKICAgIHlsYWIoIkZyZXF1ZW5jeSIpICsKICAgIHhsYWIoIiIpICsKICAgIGZhY2V0X3dyYXAodmFycyhwYXRpZW50KSwgc2NhbGVzPSJmcmVlX3giLCBuY29sID0gMSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpnMgpnZ3NhdmUoZmlsZW5hbWUgPSBwYXN0ZTAodmZhbWlseV9kaXIsICIvVl9nZW5lX2Rpc3RyaWJ1dGlvbl9ieV9zZXF1ZW5jZV9wYXRpZW50LnN2ZyIpLCBwbG90ID0gZzIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDQwLCB1bml0cyA9ICJjbSIpCmdnc2F2ZShmaWxlbmFtZSA9IHBhc3RlMCh2ZmFtaWx5X2RpciwgIi9WX2dlbmVfZGlzdHJpYnV0aW9uX2J5X3NlcXVlbmNlX3BhdGllbnQucG5nIiksIHBsb3QgPSBnMiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gNDAsIHVuaXRzID0gImNtIikKd3JpdGUudGFibGUoZmFtaWx5LCBmaWxlID0gcGFzdGUwKHZmYW1pbHlfZGlyLCAiL1ZfZ2VuZV9kaXN0cmlidXRpb25fYnlfc2VxdWVuY2VfZGF0YS50c3YiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQpgYGAKCiMgSXNvdHlwZSB1c2FnZQoKIyMgSXNvdHlwZSB1c2FnZSBwZXIgc3ViamVjdAoKYGBge3IgaXNvdHlwZV91c2FnZSwgZWNobz1GLCBmaWcud2lkdGg9MTAsIGZpZy5hc3A9MC4zLCBmaWcuYWxpZ249J2NlbnRlcid9CiMgUGxvdHRpbmcgSXNvdHlwZSBwZXJjZW50YWdlcyBwZXIgcGF0aWVudApkZl9hbGwkaXNvdHlwZSA8LSBkZl9hbGwkY19wcmltZXIKCnJlcyA8LSBkZl9hbGwgJT4lIGdyb3VwX2J5KGlzb3R5cGUsc2FtcGxlLHNvdXJjZSx0cmVhdG1lbnQsZXh0cmFjdF90aW1lKSAlPiUgZHBseXI6OnN1bW1hcmlzZShTZXFzX2lzb3R5cGU9bigpKQpyZXMgPC0gd2l0aChyZXMsIHJlc1tvcmRlcihzb3VyY2UpLF0pCnJlc19zYW1wbGUgPC0gZGZfYWxsICU+JSBncm91cF9ieShzYW1wbGUpICU+JSBkcGx5cjo6c3VtbWFyaXNlKFNlcXNfdG90YWw9bigpKQoKZnJlcXMgPC0gbWVyZ2UoeD1yZXMsIHk9cmVzX3NhbXBsZSwgYWxsLnggPSBULCBieS54ID0gInNhbXBsZSIsIGJ5LnkgPSAic2FtcGxlIikKZnJlcXMkRnJlcSA8LSAoZnJlcXMkU2Vxc19pc290eXBlL2ZyZXFzJFNlcXNfdG90YWwpCgpnNCA8LSBnZ3Bsb3QoZnJlcXMsIGFlcyhmaWxsPWV4dHJhY3RfdGltZSwgeT1GcmVxLCB4PWlzb3R5cGUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiRnJlcXVlbmN5IikgKwogIGdndGl0bGUoIklzb3R5cGUgZnJlcXVlbmN5IikgKwogIGZhY2V0X2dyaWQoY29scz12YXJzKHNvdXJjZSksIHNjYWxlcyA9ICJmcmVlIiwgZHJvcCA9IFQpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQpnNApnZ3NhdmUocGxvdD1nNCwgZmlsZW5hbWUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsIi9Jc290eXBlX2ZyZXF1ZW5jaWVzX3BhdGllbnQuc3ZnIiksIGRldmljZSA9ICJzdmciLAogIHdpZHRoID0gMjUsIGhlaWdodCA9IDcsIHVuaXRzID0gImNtIikKZ2dzYXZlKHBsb3Q9ZzQsIGZpbGVuYW1lID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9mcmVxdWVuY2llc19wYXRpZW50LnBkZiIpLCBkZXZpY2UgPSAicGRmIiwKICB3aWR0aCA9IDI1LCBoZWlnaHQgPSA3LCB1bml0cyA9ICJjbSIpCndyaXRlLnRhYmxlKGZyZXFzLCBmaWxlID0gcGFzdGUwKGlzb3R5cGVfZGlyLCIvSXNvdHlwZV9mcmVxdWVuY2llc19kYXRhLnRzdiIpLCBzZXA9Ilx0IiwgcXVvdGU9Riwgcm93Lm5hbWVzID0gRikKCmBgYAoKIyMgSXNvdHlwZSB1c2FnZSBwZXIgY2VsbCBwb3B1bGF0aW9uCgpgYGB7ciBpc290eXBlX3BvcCwgZWNobz1GLCBmaWcud2lkdGg9MTUsIGZpZy5hc3A9MSwgZmlnLmFsaWduPSdjZW50ZXInfQpyZXMgPC0gZGZfYWxsICU+JSBncm91cF9ieShpc290eXBlLCBzYW1wbGVfcG9wLCBzb3VyY2UsIHRyZWF0bWVudCwgZXh0cmFjdF90aW1lLCBwb3B1bGF0aW9uKSAlPiUgZHBseXI6OnN1bW1hcmlzZShTZXFzX2lzb3R5cGU9bigpKQpyZXMgPC0gd2l0aChyZXMsIHJlc1tvcmRlcihzb3VyY2UpLF0pCnJlc19zYW1wbGUgPC0gZGZfYWxsICU+JSBncm91cF9ieShzYW1wbGVfcG9wKSAlPiUgZHBseXI6OnN1bW1hcmlzZShTZXFzX3RvdGFsPW4oKSkKCmZyZXFzIDwtIG1lcmdlKHg9cmVzLCB5PXJlc19zYW1wbGUsIGFsbC54ID0gVCwgYnkueCA9ICJzYW1wbGVfcG9wIiwgYnkueSA9ICJzYW1wbGVfcG9wIikKZnJlcXMkRnJlcSA8LSAoZnJlcXMkU2Vxc19pc290eXBlL2ZyZXFzJFNlcXNfdG90YWwpCgpnNCA8LSBnZ3Bsb3QoZnJlcXMsIGFlcyhmaWxsPWV4dHJhY3RfdGltZSwgeT1GcmVxLCB4PWlzb3R5cGUpKSArCiBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogeGxhYigiIikgKwogeWxhYigiRnJlcXVlbmN5IikgKwogZ2d0aXRsZSgiSXNvdHlwZSBmcmVxdWVuY3kiKSArCiBmYWNldF9ncmlkKGNvbHM9dmFycyhzb3VyY2UpLCByb3dzPXZhcnMocG9wdWxhdGlvbikpICsKIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmc0Cmdnc2F2ZShnNCwgZmlsZW5hbWUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsIi9Jc290eXBlX3BlcmNlbnRhZ2VzX2NlbGxfcG9wdWxhdGlvbi5zdmciKSwgZGV2aWNlID0gInN2ZyIsCiAgd2lkdGggPSAyNSwgaGVpZ2h0ID0gMjAsIHVuaXRzID0gImNtIikKZ2dzYXZlKGc0LCBmaWxlbmFtZSA9IHBhc3RlMChpc290eXBlX2RpciwiL0lzb3R5cGVfcGVyY2VudGFnZXNfY2VsbF9wb3B1bGF0aW9uLnBkZiIpLCBkZXZpY2UgPSAicGRmIiwKICB3aWR0aCA9IDI1LCBoZWlnaHQgPSAyMCwgdW5pdHMgPSAiY20iKQoKd3JpdGUudGFibGUoZnJlcXMsIGZpbGUgPSBwYXN0ZTAoaXNvdHlwZV9kaXIsICIvSXNvdHlwZV9mcmVxdWVuY2llc19jZWxsX3BvcHVsYXRpb25fZGF0YS50c3YiKSwgc2VwPSJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKYGBgCgojIENsb25hbCBvdmVybGFwIGFuYWx5c2lzCgpgYGB7ciBjbG9uYWxfb3ZlcmxhcCwgZWNobz1GLCBmaWcuYWxpZ249J2NlbnRlcid9CiMgIyBTcGxpdHRpbmcgZGF0YSBpbiBhIHBlciBwYXRpZW50IGJhc2lzCmRmX3N1YnNldCA8LSBkZl9hbGxbLGMoInRyZWF0bWVudCIsICJleHRyYWN0X3RpbWUiLCAic291cmNlIiwgInBvcHVsYXRpb24iLCAKICAgICAgICAgICAgICAgICAgICAgICJjbG9uZV9pZCIsIAogICAgICAgICAgICAgICAgICAgICAgInZfY2FsbCIsICJkX2NhbGwiLCAial9jYWxsIiwgImp1bmN0aW9uX2xlbmd0aCIsIAogICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGUiLCAic2FtcGxlX3BvcCIpXQpkZl9wYXQgPC0gc3BsaXQoZGZfc3Vic2V0LCBkZl9zdWJzZXQkc291cmNlKQpkZl9wYXQkQ0xBRDQ8LU5VTEwKZGlyLmNyZWF0ZShwYXN0ZShvdXRkaXIsIkNsb25lX292ZXJsYXAiLCBzZXAgPSAiLyIpKQoKI2ZvciAoaSBpbiBjKDE6bGVuZ3RoKGRmX3BhdCkpKSB7CiAgICBwYXRkaXJfb3ZlcmxhcCA8LSBwYXN0ZShvdXRkaXIsIkNsb25lX292ZXJsYXAiLG5hbWVzKGRmX3BhdClbaV0sIHNlcD0iLyIpCiAgICBkaXIuY3JlYXRlKHBhdGRpcl9vdmVybGFwKQoKICAgIAogICAgIyMgUGxvdCBjaG9yZHBsb3QgY29tcGFyaXNvbiB0aW1lIHBvaW50cyBwZXIgcGF0aWVudAogICAgZGZfcGF0W1tpXV0kdGltZV9wb3AgPC0gYXMuZmFjdG9yKHBhc3RlKGRmX3BhdFtbaV1dJGV4dHJhY3RfdGltZSwgZGZfcGF0W1tpXV0kcG9wdWxhdGlvbiwgc2VwPSJfIikpCiAgICBkZl9wb3BfdGltZSA8LSBzcGxpdChkZl9wYXRbW2ldXSwgZGZfcGF0W1tpXV0kdGltZV9wb3ApCiAgCiAgICBjb3VudF9jbG9uZXMgPC0gY291bnRDbG9uZXMoZGZfcGF0W1tpXV0pCiAgCiAgICAjIyBDYWxjdWxhdGluZyBvdmVybGFwcyBiZXR3ZWVuIHRpbWUgcG9pbnRzCiAgICBjb21iaW4gPC0gZXhwYW5kLmdyaWQodW5pcXVlKGRmX3BhdFtbaV1dJGV4dHJhY3RfdGltZSksIHVuaXF1ZShkZl9wYXRbW2ldXSRwb3B1bGF0aW9uKSkKICAgIGNvbWJpbiRuYW1lcyA8LSBhcHBseShjb21iaW5bLGMoIlZhcjEiLCAiVmFyMiIpXSwgMSwgcGFzdGUsIGNvbGxhcHNlID0gIl8iKQogIAogICAgYmFzZWxpbmVzIDwtIHN1YnNldChjb21iaW4sIGNvbWJpbiRWYXIxID09ICJiYXNlbGluZSIpCiAgICBvdGhlciA8LSBzdWJzZXQoY29tYmluLCBjb21iaW4kVmFyMSAhPSAiYmFzZWxpbmUiKQogICAgY2xvbmVkZiA8LSBleHBhbmQuZ3JpZChiYXNlbGluZXMkbmFtZXMsIG90aGVyJG5hbWVzKQogICAgY29sbmFtZXMoY2xvbmVkZikgPC0gYygiZnJvbSIsInRvIikKICAgIHNlcWRmIDwtIGNsb25lZGYKICAKICAgIGxlbmludGVyc2VjdHMgPSBudW1lcmljKDApCiAgICBzZXFzaW50ZXJzZWN0cyA9IG51bWVyaWMoMCkKICAgIGZvciAoaiBpbiBjKDE6bnJvdyhjbG9uZWRmKSkpewogICAgICAgIGludGVyIDwtIGludGVyc2VjdChkZl9wb3BfdGltZVtbd2hpY2goZ3JlcGwoY2xvbmVkZltqLDFdLCBuYW1lcyhkZl9wb3BfdGltZSkpKV1dJGNsb25lX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9wb3BfdGltZVtbd2hpY2goZ3JlcGwoY2xvbmVkZltqLDJdLCBuYW1lcyhkZl9wb3BfdGltZSkpKV1dJGNsb25lX2lkKQogICAgCiAgICAgICAgY2xvbmVzX3N1YnNldCA8LSBjb3VudF9jbG9uZXNbd2hpY2goY291bnRfY2xvbmVzJGNsb25lX2lkICVpbiUgYXMuY2hhcmFjdGVyKGludGVyKSksXQogICAgCiAgICAgICAgbGVuaW50ZXJzZWN0cyA8LSBjKGxlbmludGVyc2VjdHMsIGxlbmd0aChpbnRlcikpCiAgICAgICAgc2Vxc2ludGVyc2VjdHMgPC0gYyhzZXFzaW50ZXJzZWN0cywgc3VtKGNsb25lc19zdWJzZXQkc2VxX2NvdW50KSkKICAgIH0KICAKICAgIGNsb25lZGYkdmFsdWUgPC0gbGVuaW50ZXJzZWN0cwogICAgc2VxZGYkdmFsdWUgPC0gc2Vxc2ludGVyc2VjdHMKICAKICAgICMgU2F2aW5nIGJvdGggdGFibGVzCiAgICB3cml0ZS50YWJsZShjbG9uZWRmLCBmaWxlID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9vdmVybGFwX2NvbXBhcmlzb25fdGltZV9wb2ludHNfIiwgZGZfcG9wX3RpbWVbWzFdXSR0cmVhdG1lbnRbMV0sICJfIiwgZGZfcG9wX3RpbWVbWzFdXSRzb3VyY2VbMV0sICIudHN2Iiwgc2VwPSIiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQogICAgd3JpdGUudGFibGUoc2VxZGYsIGZpbGUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX3NlcU5fb3ZlcmxhcF9jb21wYXJpc29uX3RpbWVfcG9pbnRzXyIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCAiXyIsIGRmX3BvcF90aW1lW1sxXV0kc291cmNlWzFdLCAiLnRzdiIsIHNlcD0iIiksIHNlcCA9ICJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKICAKICAgICNncmlkLmNvbCA9IGMoIiNhNmNlZTMiLCAiI2IyZGY4YSIsICIjZmI5YTk5IiwgIiNmZGJmNmYiLCAiIzFmNzhiNCIsICIjMzNhMDJjIiwgIiNlMzFhMWMiLCAiI2ZmN2YwMCIpCiAgICAjbmFtZXMoZ3JpZC5jb2wpIDwtIGNsb25lZGYkZnJvbQoKICAKICAgICMgQ2xvbmUgb3ZlcmxhcCBwbG90CiAgICBzdmcoZmlsZW5hbWUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX292ZXJsYXBfY29tcGFyaXNvbl90aW1lX3BvaW50c18iLAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfcG9wX3RpbWVbWzFdXSR0cmVhdG1lbnRbMV0sICJfIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSwgIi5zdmciLCBzZXA9IiIpKQogICAgICAgIGNob3JkRGlhZ3JhbShjbG9uZWRmLCAKICAgICAgICAgICAgICAgICBncmlkLmNvbCA9IGdyaWQuY29sLCAKICAgICAgICAgICAgICAgICBzZWxmLmxpbmsgPSAxLAogICAgICAgICAgICAgICAgIHRyYW5zcGFyZW5jeSA9IDAuMywKICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJhY2s9ImdyaWQiLAogICAgICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gbGlzdCh0cmFjay5oZWlnaHQgPSBtYXgoc3Ryd2lkdGgodW5saXN0KGRpbW5hbWVzKGNsb25lZGYpKSkpKSkKICAgICAgICBjaXJjb3MudHJhY2sodHJhY2suaW5kZXggPSAxLCAKICAgICAgICAgICAgICAgICBwYW5lbC5mdW4gPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcmNvcy50ZXh0KENFTExfTUVUQSR4Y2VudGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMTF9NRVRBJHlsaW1bMl0sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMX01FVEEkc2VjdG9yLmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGogPSBjKDAsIDAuNSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGJnLmJvcmRlciA9IE5BKQogICAgICAgIHRpdGxlKHBhc3RlKCJjbG9uZSBvdmVybGFwIiwgZGZfcG9wX3RpbWVbWzFdXSR0cmVhdG1lbnRbMV0sIGRmX3BvcF90aW1lW1sxXV0kc291cmNlWzFdKSwgY2V4ID0gMC44KQogICAgICAgIGNpcmNvcy5jbGVhcigpCiAgICBkZXYub2ZmKCkKICAKICAgIHBuZyhmaWxlbmFtZSA9IHBhc3RlKHBhdGRpcl9vdmVybGFwLCAiL0Nsb25lX292ZXJsYXBfY29tcGFyaXNvbl90aW1lX3BvaW50c18iLCBkZl9wb3BfdGltZVtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSwgIi5wbmciLCBzZXA9IiIpLCB3aWR0aD0xNSwgaGVpZ2h0PTE1LCB1bml0cyA9ICJjbSIsIHJlcyA9IDMwMCkKICAgIGNob3JkRGlhZ3JhbShjbG9uZWRmLCAKICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgc2VsZi5saW5rID0gMSwKICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSAwLjMsCiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICBwcmVBbGxvY2F0ZVRyYWNrcyA9IGxpc3QodHJhY2suaGVpZ2h0ID0gbWF4KHN0cndpZHRoKHVubGlzdChkaW1uYW1lcyhjbG9uZWRmKSkpKSkpCiAgICBjaXJjb3MudHJhY2sodHJhY2suaW5kZXggPSAxLCBwYW5lbC5mdW4gPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGNpcmNvcy50ZXh0KENFTExfTUVUQSR4Y2VudGVyLCBDRUxMX01FVEEkeWxpbVsyXSwgQ0VMTF9NRVRBJHNlY3Rvci5pbmRleCwKICAgICAgICAgICAgICAgICAgYWRqID0gYygwLCAwLjUpKQogICAgfSwgYmcuYm9yZGVyID0gTkEpCiAgICB0aXRsZShwYXN0ZSgiY2xvbmVfaWQgT1ZFUkxBUCIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSksIGNleCA9IDAuOCkKICAgIGNpcmNvcy5jbGVhcigpCiAgICBkZXYub2ZmKCkKICAKICAgICMgU2VxdWVuY2VzIG92ZXJsYXAgcGxvdAogICAgc3ZnKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9zZXFOX292ZXJsYXBfY29tcGFyaXNvbl90aW1lX3BvaW50c18iLCBkZl9wb3BfdGltZVtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSwgIi5zdmciLCBzZXA9IiIpKQogICAgY2hvcmREaWFncmFtKHNlcWRmLCAKICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgc2VsZi5saW5rID0gMSwKICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSAwLjMsCiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICBwcmVBbGxvY2F0ZVRyYWNrcyA9IGxpc3QodHJhY2suaGVpZ2h0ID0gbWF4KHN0cndpZHRoKHVubGlzdChkaW1uYW1lcyhzZXFkZikpKSkpKQogICAgY2lyY29zLnRyYWNrKHRyYWNrLmluZGV4ID0gMSwgcGFuZWwuZnVuID0gZnVuY3Rpb24oeCwgeSkgewogICAgICBjaXJjb3MudGV4dChDRUxMX01FVEEkeGNlbnRlciwgQ0VMTF9NRVRBJHlsaW1bMl0sIENFTExfTUVUQSRzZWN0b3IuaW5kZXgsCiAgICAgICAgICAgICAgICAgIGFkaiA9IGMoMCwgMC41KSkKICAgIH0sIGJnLmJvcmRlciA9IE5BKQogICAgdGl0bGUocGFzdGUoIkNMT05FIFNFUSBOVU0gT1ZFUkxBUCIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSksIGNleCA9IDAuOCkKICAgIGNpcmNvcy5jbGVhcigpCiAgICBkZXYub2ZmKCkKICAKICAgIHBuZyhmaWxlbmFtZSA9IHBhc3RlKHBhdGRpcl9vdmVybGFwLCAiL0Nsb25lX3NlcU5fb3ZlcmxhcF9jb21wYXJpc29uX3RpbWVfcG9pbnRzXyIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCAiXyIsIGRmX3BvcF90aW1lW1sxXV0kc291cmNlWzFdLCAiLnBuZyIsIHNlcD0iIiksIHdpZHRoPTE1LCBoZWlnaHQ9MTUsIHVuaXRzID0gImNtIiwgcmVzID0gMzAwKQogICAgY2hvcmREaWFncmFtKHNlcWRmLCAKICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgc2VsZi5saW5rID0gMSwKICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSAwLjMsCiAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICBwcmVBbGxvY2F0ZVRyYWNrcyA9IGxpc3QodHJhY2suaGVpZ2h0ID0gbWF4KHN0cndpZHRoKHVubGlzdChkaW1uYW1lcyhzZXFkZikpKSkpKQogICAgY2lyY29zLnRyYWNrKHRyYWNrLmluZGV4ID0gMSwgcGFuZWwuZnVuID0gZnVuY3Rpb24oeCwgeSkgewogICAgICBjaXJjb3MudGV4dChDRUxMX01FVEEkeGNlbnRlciwgQ0VMTF9NRVRBJHlsaW1bMl0sIENFTExfTUVUQSRzZWN0b3IuaW5kZXgsCiAgICAgICAgICAgICAgICAgIGFkaiA9IGMoMCwgMC41KSkKICAgIH0sIGJnLmJvcmRlciA9IE5BKQogICAgdGl0bGUocGFzdGUoIkNMT05FIFNFUSBOVU0gT1ZFUkxBUCIsIGRmX3BvcF90aW1lW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BfdGltZVtbMV1dJHNvdXJjZVsxXSksIGNleCA9IDAuOCkKICAgIGNpcmNvcy5jbGVhcigpCiAgICBkZXYub2ZmKCkKICAKICAgICMgCiAgICAjIAogICAgZGZfVFAgPC0gc3BsaXQoZGZfcGF0W1tpXV0sIGRmX3BhdFtbaV1dJGV4dHJhY3RfdGltZSkKICAKICAjIFBsb3RzIHBlciBwYXRpZW50IGFuZCB0aW1lIHBvaW50IC0gb3ZlcmxhcCBwb3B1bGF0aW9ucwogICAgZm9yIChuIGluIGMoMTpsZW5ndGgoZGZfVFApKSkgewogICAgICBkZl9wb3AgPC0gc3BsaXQoZGZfVFBbW25dXSwgZGZfVFBbW25dXSRwb3B1bGF0aW9uKQogICAgICB2ZW5ucGxvdCA8LSB2ZW5uKGxpc3QodW5pcXVlKGRmX3BvcFtbMV1dJGNsb25lX2lkKSwgdW5pcXVlKGRmX3BvcFtbMl1dJGNsb25lX2lkKSwgdW5pcXVlKGRmX3BvcFtbM11dJGNsb25lX2lkKSwgdW5pcXVlKGRmX3BvcFtbNF1dJGNsb25lX2lkKSksIG5hbWVzID0gbmFtZXMoZGZfcG9wKSkKICAgICAgCiAgICAgIGxpc3RJbnB1dCA8LSBsaXN0KGRmX3BvcFtbMV1dJGNsb25lX2lkLCBkZl9wb3BbWzJdXSRjbG9uZV9pZCwgZGZfcG9wW1szXV0kY2xvbmVfaWQsIGRmX3BvcFtbNF1dJGNsb25lX2lkKQogICAgICBuYW1lcyhsaXN0SW5wdXQpIDwtIG5hbWVzKGRmX3BvcCkKICAgICAgY29tYmluIDwtIGRhdGEuZnJhbWUoZnJvbT1jb21iaW5hdGlvbnMoNCwyLG5hbWVzKGRmX3BvcCkscmVwZWF0cy5hbGxvd2VkPUYpWywxXSwgdG89Y29tYmluYXRpb25zKDQsMixuYW1lcyhkZl9wb3ApLHJlcGVhdHMuYWxsb3dlZD1GKVssMl0pCiAgICAgIAogICAgICAjbGlzdElucHV0IDwtIGxpc3QoZGZfcG9wW1sxXV0kY2xvbmVfaWQsIGRmX3BvcFtbMl1dJGNsb25lX2lkLCBkZl9wb3BbWzNdXSRjbG9uZV9pZCwgZGZfcG9wW1s0XV0kY2xvbmVfaWQpCiAgICAgICNuYW1lcyhsaXN0SW5wdXQpIDwtIG5hbWVzKGRmX3BvcCkKICAgICAgCiAgICAgICMgVXBzZXQgcGxvdHMKICAgICAgc3ZnKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9TZXRfcGxvdF8iLCBkZl9wb3BbWzFdXSR0cmVhdG1lbnRbMV0sICJfIixkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIixkZl9wb3BbWzFdXSRzb3VyY2VbMV0sICIuc3ZnIiwgc2VwPSIiKSkKICAgICAgdXBzZXQoZnJvbUxpc3QobGlzdElucHV0KSwgZ3JvdXAuYnkgPSAic2V0cyIsIG9yZGVyLmJ5PSJmcmVxIiwgcG9pbnQuc2l6ZSA9IDMuNSwgbGluZS5zaXplPTIsIG1haW5iYXIueS5sYWJlbCA9ICJDbG9uZSBpbnRlcnNlY3Rpb25zIiwgc2V0cy54LmxhYmVsID0gIkNsb25lcyBwZXIgcG9wdWxhdGlvbiIpCiAgICAgIGRldi5vZmYoKQogICAgICAKICAgICAgcG5nKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9TZXRfcGxvdF8iLCBkZl9wb3BbWzFdXSR0cmVhdG1lbnRbMV0sICJfIixkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIixkZl9wb3BbWzFdXSRzb3VyY2VbMV0sICIucG5nIiwgc2VwPSIiKSwgcmVzID0gNjAwLCB3aWR0aCA9IDE1LCBoZWlnaHQ9MTAsIHVuaXRzID0gImNtIikKICAgICAgdXBzZXQoZnJvbUxpc3QobGlzdElucHV0KSwgb3JkZXIuYnk9ImZyZXEiLCBncm91cC5ieSA9ICJzZXRzIiwgcG9pbnQuc2l6ZSA9IDMuNSwgbGluZS5zaXplPTIsIG1haW5iYXIueS5sYWJlbCA9ICJDbG9uZSBpbnRlcnNlY3Rpb25zIiwgc2V0cy54LmxhYmVsID0gIkNsb25lcyBwZXIgcG9wdWxhdGlvbiIpCiAgICAgIGRldi5vZmYoKQogICAgICAKICAgICAgY2xvbmVkZiA8LSBjb21iaW4KICAgICAgc2VxZGYgPC0gY29tYmluCiAgICAgIAogICAgICBsZW5pbnRlcnNlY3RzID0gbnVtZXJpYygwKQogICAgICBzZXFzaW50ZXJzZWN0cyA9IG51bWVyaWMoMCkKICAgICAgZm9yIChqIGluIGMoMTpucm93KGNsb25lZGYpKSl7CiAgICAgICAgaW50ZXIgPC0gaW50ZXJzZWN0KGRmX3BvcFtbd2hpY2goZ3JlcGwocGFzdGUwKCJeIixjbG9uZWRmW2osMV0pLCBuYW1lcyhkZl9wb3ApKSldXSRjbG9uZV9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmX3BvcFtbd2hpY2goZ3JlcGwocGFzdGUwKCJeIixjbG9uZWRmW2osMl0pLCBuYW1lcyhkZl9wb3ApKSldXSRjbG9uZV9pZCkKICAgICAgICAKICAgICAgICBjbG9uZXNfc3Vic2V0IDwtIGNvdW50X2Nsb25lc1t3aGljaChjb3VudF9jbG9uZXMkY2xvbmVfaWQgJWluJSBhcy5jaGFyYWN0ZXIoaW50ZXIpKSxdCiAgICAgICAgCiAgICAgICAgbGVuaW50ZXJzZWN0cyA8LSBjKGxlbmludGVyc2VjdHMsIGxlbmd0aChpbnRlcikpCiAgICAgICAgc2Vxc2ludGVyc2VjdHMgPC0gYyhzZXFzaW50ZXJzZWN0cywgc3VtKGNsb25lc19zdWJzZXQkc2VxX2NvdW50KSkKICAgICAgfQogICAgICAKICAgICAgY2xvbmVkZiR2YWx1ZSA8LSBsZW5pbnRlcnNlY3RzCiAgICAgIHNlcWRmJHZhbHVlIDwtIHNlcXNpbnRlcnNlY3RzCiAgICAgIAogICAgICAKICAgICAgc2VsZl9jb21iIDwtIGRhdGEuZnJhbWUoZnJvbSA9IG5hbWVzKGRmX3BvcCksIHRvID0gbmFtZXMoZGZfcG9wKSkKICAgICAgc2VsZl9jbG9uZWRmIDwtIHNlbGZfY29tYgogICAgICBzZWxmX3NlcWRmPC0gc2VsZl9jb21iCiAgICAgIAogICAgICBsZW5pbnRlcnNlY3RzIDwtIG51bWVyaWMoMCkKICAgICAgc2Vxc2ludGVyc2VjdHMgPC0gbnVtZXJpYygwKQogICAgICBmb3IgKHBvcCBpbiBzZWxmX2NvbWIkZnJvbSl7CiAgICAgICAgaW50ZXIgPC0gYXR0cmlidXRlcyh2ZW5ucGxvdClbWyJpbnRlcnNlY3Rpb25zIl1dW1twb3BdXQogICAgICAgIGNsb25lc19zdWJzZXQgPC0gY291bnRfY2xvbmVzW3doaWNoKGNvdW50X2Nsb25lcyRjbG9uZV9pZCAlaW4lIGFzLmNoYXJhY3RlcihpbnRlcikpLF0KICAgICAgICAKICAgICAgICBsZW5pbnRlcnNlY3RzIDwtIGMobGVuaW50ZXJzZWN0cywgbGVuZ3RoKGludGVyKSkKICAgICAgICBzZXFzaW50ZXJzZWN0cyA8LSBjKHNlcXNpbnRlcnNlY3RzLCBzdW0oY2xvbmVzX3N1YnNldCRzZXFfY291bnQpKQogICAgICB9CiAgICAgIHNlbGZfY2xvbmVkZiR2YWx1ZSA8LSBsZW5pbnRlcnNlY3RzCiAgICAgIHNlbGZfc2VxZGYkdmFsdWUgPC0gc2Vxc2ludGVyc2VjdHMKICAgICAgCiAgICAgIGNsb25lZGYgPC0gcmJpbmQoY2xvbmVkZiwgc2VsZl9jbG9uZWRmKQogICAgICBzZXFkZiA8LSByYmluZChzZXFkZiwgc2VsZl9zZXFkZikKICAgICAgCiAgICAgIHdyaXRlLnRhYmxlKGNsb25lZGYsIGZpbGUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX292ZXJsYXBfY29tcGFyaXNvbl9wb3B1bGF0aW9uXyIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIiwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCAiLnRzdiIsIHNlcD0iIiksIHNlcCA9ICJcdCIsIHF1b3RlID0gRiwgcm93Lm5hbWVzID0gRikKICAgICAgd3JpdGUudGFibGUoc2VxZGYsIGZpbGUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX3NlcU5fb3ZlcmxhcF9jb21wYXJpc29uX3BvcHVsYXRpb25fIiwgZGZfcG9wW1sxXV0kdHJlYXRtZW50WzFdLCAiXyIsIGRmX3BvcFtbMV1dJGV4dHJhY3RfdGltZVsxXSwgIl8iLCBkZl9wb3BbWzFdXSRzb3VyY2VbMV0sICIudHN2Iiwgc2VwPSIiKSwgc2VwID0gIlx0IiwgcXVvdGUgPSBGLCByb3cubmFtZXMgPSBGKQogICAgICAKICAgICAgZ3JpZC5jb2wgPSBjKCIjMjI1ZWE4IiwiIzQxYjZjNCIsIiNhMWRhYjQiLCIjZmZmZmNjIikKICAgICAgCiAgICAgIAogICAgICAjIFBsb3RzIGNsb25lIG92ZXJsYXAKICAgICAgc3ZnKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9vdmVybGFwX2NvbXBhcmlzb25fcG9wdWxhdGlvbl8iLCBkZl9wb3BbWzFdXSR0cmVhdG1lbnRbMV0sICJfIiwgZGZfcG9wW1sxXV0kZXh0cmFjdF90aW1lWzFdLCAiXyIsIGRmX3BvcFtbMV1dJHNvdXJjZVsxXSwgIi5zdmciLCBzZXA9IiIpKQogICAgICBjaG9yZERpYWdyYW0oY2xvbmVkZiwgCiAgICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmsgPSAxLAogICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gMC4zLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gbGlzdCh0cmFjay5oZWlnaHQgPSBtYXgoc3Ryd2lkdGgodW5saXN0KGRpbW5hbWVzKGNsb25lZGYpKSkpKSkKICAgICAgY2lyY29zLnRyYWNrKHRyYWNrLmluZGV4ID0gMSwgcGFuZWwuZnVuID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgICAgICAgICAgICAgIGNpcmNvcy50ZXh0KENFTExfTUVUQSR4Y2VudGVyLCBDRUxMX01FVEEkeWxpbVsyXSwgQ0VMTF9NRVRBJHNlY3Rvci5pbmRleCwKICAgICAgICAgICAgICAgICAgICBhZGogPSBjKDAsIDAuNSkpCiAgICAgICAgICAgICAgICAgICAgfSwgYmcuYm9yZGVyID0gTkEpCiAgICAgIHRpdGxlKHBhc3RlKCJjbG9uZV9pZCBPVkVSTEFQIiwgZGZfcG9wW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BbWzFdXSRzb3VyY2VbMV0sIGRmX3BvcFtbMV1dJGV4dHJhY3RfdGltZVsxXSksIGNleCA9IDAuOCkKICAgICAgY2lyY29zLmNsZWFyKCkKICAgICAgZGV2Lm9mZigpCiAgICAgIAogICAgICBwbmcoZmlsZW5hbWUgPSBwYXN0ZShwYXRkaXJfb3ZlcmxhcCwiL0Nsb25lX292ZXJsYXBfY29tcGFyaXNvbl9wb3B1bGF0aW9uXyIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIiwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCAiLnBuZyIsIHNlcD0iIiksIHJlcyA9IDYwMCwgd2lkdGggPSAxNSwgaGVpZ2h0PTEwLCB1bml0cyA9ICJjbSIpCiAgICAgIGNob3JkRGlhZ3JhbShjbG9uZWRmLCAKICAgICAgICAgICAgICAgICAgICNncmlkLmNvbCA9IGdyaWQuY29sLCAKICAgICAgICAgICAgICAgICAgIHNlbGYubGluayA9IDEsCiAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVuY3kgPSAwLjMsCiAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVHJhY2s9ImdyaWQiLAogICAgICAgICAgICAgICAgICAgcHJlQWxsb2NhdGVUcmFja3MgPSBsaXN0KHRyYWNrLmhlaWdodCA9IG1heChzdHJ3aWR0aCh1bmxpc3QoZGltbmFtZXMoY2xvbmVkZikpKSkpKQogICAgICBjaXJjb3MudHJhY2sodHJhY2suaW5kZXggPSAxLCBwYW5lbC5mdW4gPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgY2lyY29zLnRleHQoQ0VMTF9NRVRBJHhjZW50ZXIsIENFTExfTUVUQSR5bGltWzJdLCBDRUxMX01FVEEkc2VjdG9yLmluZGV4LAogICAgICAgICAgICAgICAgICAgIGFkaiA9IGMoMCwgMC41KSkKICAgICAgfSwgYmcuYm9yZGVyID0gTkEpCiAgICAgIHRpdGxlKHBhc3RlKCJjbG9uZV9pZCBPVkVSTEFQIiwgZGZfcG9wW1sxXV0kdHJlYXRtZW50WzFdLCBkZl9wb3BbWzFdXSRzb3VyY2VbMV0sIGRmX3BvcFtbMV1dJGV4dHJhY3RfdGltZVsxXSksIGNleCA9IDAuOCkKICAgICAgY2lyY29zLmNsZWFyKCkKICAgICAgZGV2Lm9mZigpCiAgICAKICAgICAgIyBQbG90cyBjbG9uZSBzZXF1ZW5jZSBudW1iZXJzIG92ZXJsYXAKICAgICAgc3ZnKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9zZXFOX292ZXJsYXBfY29tcGFyaXNvbl9wb3B1bGF0aW9uXyIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIiwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCAiLnN2ZyIsIHNlcD0iIikpCiAgICAgIGNob3JkRGlhZ3JhbShzZXFkZiwgCiAgICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmsgPSAxLAogICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gMC4zLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gbGlzdCh0cmFjay5oZWlnaHQgPSBtYXgoc3Ryd2lkdGgodW5saXN0KGRpbW5hbWVzKHNlcWRmKSkpKSkpCiAgICAgIGNpcmNvcy50cmFjayh0cmFjay5pbmRleCA9IDEsIHBhbmVsLmZ1biA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICBjaXJjb3MudGV4dChDRUxMX01FVEEkeGNlbnRlciwgQ0VMTF9NRVRBJHlsaW1bMl0sIENFTExfTUVUQSRzZWN0b3IuaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgYWRqID0gYygwLCAwLjUpKQogICAgICB9LCBiZy5ib3JkZXIgPSBOQSkKICAgICAgdGl0bGUocGFzdGUoIkNMT05FIFNFUSBOVU0gT1ZFUkxBUCIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0pLCBjZXggPSAwLjgpCiAgICAgIGNpcmNvcy5jbGVhcigpCiAgICAgIGRldi5vZmYoKQogICAgICAKICAgICAgcG5nKGZpbGVuYW1lID0gcGFzdGUocGF0ZGlyX292ZXJsYXAsIi9DbG9uZV9zZXFOX292ZXJsYXBfY29tcGFyaXNvbl9wb3B1bGF0aW9uXyIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgIl8iLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0sICJfIiwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCAiLnBuZyIsIHNlcD0iIiksIHJlcyA9IDYwMCwgd2lkdGggPSAxNSwgaGVpZ2h0PTEwLCB1bml0cyA9ICJjbSIpCiAgICAgIGNob3JkRGlhZ3JhbShzZXFkZiwgCiAgICAgICAgICAgICAgICAgICAjZ3JpZC5jb2wgPSBncmlkLmNvbCwgCiAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmsgPSAxLAogICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5ID0gMC4zLAogICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvblRyYWNrPSJncmlkIiwKICAgICAgICAgICAgICAgICAgIHByZUFsbG9jYXRlVHJhY2tzID0gbGlzdCh0cmFjay5oZWlnaHQgPSBtYXgoc3Ryd2lkdGgodW5saXN0KGRpbW5hbWVzKHNlcWRmKSkpKSkpCiAgICAgIGNpcmNvcy50cmFjayh0cmFjay5pbmRleCA9IDEsIHBhbmVsLmZ1biA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICBjaXJjb3MudGV4dChDRUxMX01FVEEkeGNlbnRlciwgQ0VMTF9NRVRBJHlsaW1bMl0sIENFTExfTUVUQSRzZWN0b3IuaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgYWRqID0gYygwLCAwLjUpKQogICAgICB9LCBiZy5ib3JkZXIgPSBOQSkKICAgICAgdGl0bGUocGFzdGUoIkNMT05FIFNFUSBOVU0gT1ZFUkxBUCIsIGRmX3BvcFtbMV1dJHRyZWF0bWVudFsxXSwgZGZfcG9wW1sxXV0kc291cmNlWzFdLCBkZl9wb3BbWzFdXSRleHRyYWN0X3RpbWVbMV0pLCBjZXggPSAwLjgpCiAgICAgIGNpcmNvcy5jbGVhcigpCiAgICAgIGRldi5vZmYoKQogICAgfQojfQoKYGBgCgoKIyBDaXRhdGlvbnMKCklmIHlvdSB1c2UgbmYtY29yZS9iY2VsbG1hZ2ljIGZvciB5b3VyIGFuYWx5c2lzLCBwbGVhc2UgY2l0ZSBpdCB1c2luZyB0aGUgZm9sbG93aW5nIERPSTogWzEwLjUyODEvemVub2RvLjM2MDc0MDhdKGh0dHBzOi8vZG9pLm9yZy8xMC41MjgxL3plbm9kby4zNjA3NDA4KQoKUGxlYXNlIGFsc28gY2l0ZSB0aGUgYG5mLWNvcmVgIHB1YmxpY2F0aW9uIFtAZXdlbHMyMDIwXS4KCkluIGFkZGl0aW9uLCBjaXRhdGlvbnMgZm9yIHRoZSB0b29scyBhbmQgZGF0YSB1c2VkIGluIHRoaXMgcGlwZWxpbmUgYXJlIGFzIGZvbGxvd3M6CgoqICoqcFJFU1RPKiogW0BWYW5kZXJIZWlkZW4yMDE0XQoqICoqU0hhemFNLCBDaGFuZ2UtTyoqIFtAR3VwdGEyMDE1XQoqICoqQWxha2F6YW0qKiBbQFN0ZXJuMjAxNF0KKiAqKlRJZ0dFUioqIFtAR2FkYWxhLU1hcmlhMjAxNV0KKiAqKkZhc3RRQyoqIFtAYW5kcmV3czIwMTBdCiogKipNdWx0aVFDKiogW0Bld2VsczIwMTZdCg==